我在這裏發帖之前檢查出這個線程:基本上How to avoid memory leaks when using a vector of pointers to dynamically allocated objects in C++?向量指向動態分配對象的向量:會出現什麼問題?
,我有指向動態分配的對象的指針的一些載體:
vector<MyType*> a;
a.push_back(new MyType());
這些載體是幾類的私有實例變量我通過遍歷矢量並在每個指針上調用delete
,在類的析構函數中銷燬動態分配的對象。
它大部分時間都正常工作,但每過一段時間,其中一個向量中的指針就會失效,並在我的代碼嘗試使用它時導致segfault
。我無法弄清楚爲什麼這些指針偶爾會斷裂。
動態分配對象的地址會發生變化並導致指針無效的原因是什麼?
如果需要,我可以嘗試發佈實際代碼。
編輯:
好吧,我有一些事情怎麼回事。有兩個自定義類:VisaLane
和VisaResource
。 VisaLane
包含使用new VisaResource()
創建的VisaResources指針的vector<VisaResource*>
。
也使用new VisaLane()
創建每個VisaLane
,其指針存儲在vector<VisaLane*>
中。
這是指針被破壞的一個例子。項目0的載體具有不可訪問的成員:
resources_ <3 items> std::vector<VisaResource*>
[0] VisaResource
function_ <not accessible> std::string
name_ <not accessible> std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 6998928 uint
[1] VisaResource
function_ "lane_clksel" std::string
name_ "m1_lane0_clksel" std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 0 uint
[2] VisaResource
function_ "lane_bypass" std::string
name_ "m1_lane0_bypass" std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 0 uint
visa_res_itr __gnu_cxx::__normal_iterator<VisaResource**, std::vector<VisaResource*>>
我應該補充說,我會在boost庫中使用漂亮的自動指針,但我的客戶只需要使用標準庫的代碼,並且特別要求不要提升代碼。相信我,我試圖說服他們,否則他們不想讓步。 –
TR1是一個選項嗎?這與大多數半新編譯器一起提供,你可以創建一個'std :: tr1 :: shared_ptr's的容器來解決你的問題。 –
嫌疑人可能包括寫入不良地址和內存覆蓋。 –