我將一些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密集程度相當高。
你沒有問這個,但是你應該嘗試std :: shared_ptr(C++ 11),以前在std :: tr1中,如果你正在移植java代碼的話。 Java使用垃圾收集,將它轉換爲C++是一件棘手的事情,而不會導致任何內存泄漏。 – 2012-08-12 22:30:06
@EvanDark是的,我想這樣做,但VC++ 2010不支持它。我在解決物體壽命時遇到了大量問題。編輯:它似乎知道std :: tr1 – James 2012-08-12 22:34:40
只是爲了確保,你用'new'來分配空間和'delete'來釋放它嗎?取消指針不會釋放C++中的內存。 – 2012-08-12 22:36:15