2011-08-16 84 views
0

我在這裏發帖之前檢查出這個線程:基本上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。我無法弄清楚爲什麼這些指針偶爾會斷裂。

動態分配對象的地址會發生變化並導致指針無效的原因是什麼?

如果需要,我可以嘗試發佈實際代碼。

編輯:

好吧,我有一些事情怎麼回事。有兩個自定義類:VisaLaneVisaResourceVisaLane包含使用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*>> 
+0

我應該補充說,我會在boost庫中使用漂亮的自動指針,但我的客戶只需要使用標準庫的代碼,並且特別要求不要提升代碼。相信我,我試圖說服他們,否則他們不想讓步。 –

+2

TR1是一個選項嗎?這與大多數半新編譯器一起提供,你可以創建一個'std :: tr1 :: shared_ptr's的容器來解決你的問題。 –

+0

嫌疑人可能包括寫入不良地址和內存覆蓋。 –

回答

1

你不應該使用原始指針可言,避免這種情況最好的辦法是使用智能指針Unique_ptr如果你沒有共享的shared_ptr如果你的向量內容容器元素在多個實體之間共享。

使用智能指針將最有可能幫助您擺脫您的問題。

除此之外,沒有看到源代碼,我們不能評論什麼是真正的錯誤。

+0

哪些智能指針類型在像矢量這樣的容器中工作? –

+0

@Andrew Wiens:幾乎每一個最可能你需要的東西(根據需要,如上面的答案中所提到的)是:'std :: tr1 :: shared_ptr'或'std :: unique_ptr',遠離'auto_ptr'不過,它並不適用於STl容器。 –

+0

它們必須是可複製的才能與STL容器一起使用。不能使用'std :: auto_ptr',因爲它交換了賦值所有權,因此無法複製。 – AJG85

1

如果您的編譯器支持C++ 0x,您可以爲STL容器創建自己的可複製引用計數智能指針類,或使用std::unique_ptr。如果它稍微老一些,你可能在std::tr1命名空間中有一些東西。

或者考慮std::vector<MyType>,因爲該容器在堆上連續分配,並將爲您管理內存。不惜一切代價避免原始指針。