2012-08-25 65 views
0

我的問題是這樣的,我有一個對象,我會初始化後,我將推入一個向量。該向量將在當前方法超出範圍之後很長時間使用。我如何避免內存泄漏,當我不能立即處理數據

的代碼看起來是這樣的:

DataObject *ptrDataObj = new DataObject(); 
Parent::DataVector.push_back(ptrDataObj); 
: 
: 
// end of method 

這個實施將導致肯定的內存泄漏。但是,如果我使用RAII而不是指針,那麼在DataVector使用它時DataObject已經超出了範圍。我看到的唯一選擇可能涉及某種副本。

我已經沉浸在C#多年現在,並試圖再次在本土世界重新振作自己。

請指教..

+3

這裏沒有內存泄漏。如果以後從DataVector中刪除指針但忘記刪除它,則確實存在內存泄漏。所以不要忘記在那個時候刪除它。 – nos

+0

你可以有一個向量unique_ptr或shared_ptr – NoSenseEtAl

回答

4

爲什麼您的向量是通過指針而不是按值存儲對象?

讓您的載體是一個:

  • std::vector<DataObject>
  • std::vector<std::shared_ptr<DataObject> >

此外,如果您使用的是C++ 11,則可以使用emplace_back來避免副本。

std::vector<DataObject> vec; 
vec.emplace_back(constructor_arg1, constructor_arg2); 
+0

這是一個簡單的翻譯,向量將實際存儲包含指向我剛剛初始化的數據對象的指針的對象。 Wrapper wrapObj(ptrDataObj);父:: DataVector.push_back(w); 這實際上是我想說明的。 –

+0

評論並沒有讓我更明白你看到的限制是什麼。我想你需要編輯問題並添加一些額外的上下文。 (I.E,什麼是Parent :: DataVector)。 –

2

不過,如果我使用RAII,而不是一個指針,該數據對象將已通過的時間替換dataVector將使用它超出範圍。

如果您正確使用它,請勿使用它。如果您使用引用計數智能指針,則該對象的生存期至少與矢量一樣長,並且將被正確處置。