2012-08-12 71 views
0

我將一些Java移植到C++,並且很天真地跳到使用std::vector當超出範圍時停止調用標準的std :: vector

這是我的問題。我有一個對象的存儲庫,並在某個時間點後,我將需要 這個存儲庫中的對象列表滿足一些條件。目前我正在將它們讀入臨時文件std::vector。事實證明,當這個臨時超出範圍 它將delete它的內容,當然這將導致存儲庫中的懸掛指針。

這是我目前的'解決方法',我覺得特別噁心。

#define NULLIFY(aParam) \ 
{ \ 
    for (size_t i = 0; i < aParam.size(); i++) { \ 
     aParam[i] = NULL; \ 
    } \ 
} 

typedef std::vector<Object*> TObjectVector; 

int main(int argc, char* argv[]) 
{ 
    PopulateRepository(); // repository uses std::set 

    TObjectVector subset; 
    Repository.GetConditionSatisfyingObjects(subset); 
    DoSomething(subset); 

    NULLIFY(subset); // Stop destruction of the objects. 
} 

我接受其他的想法。我原本的工作是使用原始指針和動態分配,但我想知道是否使用STL加快了速度,因爲我有更少的參數需要傳遞。該程序是多線程的並且CPU密集程度相當高。

+0

你沒有問這個,但是你應該嘗試std :: shared_ptr(C++ 11),以前在std :: tr1中,如果你正在移植java代碼的話。 Java使用垃圾收集,將它轉換爲C++是一件棘手的事情,而不會導致任何內存泄漏。 – 2012-08-12 22:30:06

+0

@EvanDark是的,我想這樣做,但VC++ 2010不支持它。我在解決物體壽命時遇到了大量問題。編輯:它似乎知道std :: tr1 – James 2012-08-12 22:34:40

+0

只是爲了確保,你用'new'來分配空間和'delete'來釋放它嗎?取消指針不會釋放C++中的內存。 – 2012-08-12 22:36:15

回答

5

如果你有一個向量指針,例如std::vector<Object*>Object析構函數將會調用而不是

如果你有一個對象的向量,例如std::vector<Object>,那麼你存儲副本任何被「放入」的向量。所以我不確定搖晃的指針可能來自哪裏。

+0

好吧,當我讀到它的工作原理時,我必須在事情發生過程中誤導一些其他帖子。謝謝 – James 2012-08-12 22:31:00