我正在創建一個粒子物理模擬器,並且需要進行適當的內存管理。從指針向量中釋放內存
我發現很方便,我的方法一次傳播幾個粒子,所以這個方法返回一個軌跡向量,每個軌跡是一個步驟矢量(因此得到一個vector< vector<> >
)。
(步驟是我創建的類。)
vector< vector<Step*> > Propagator::Propagate (vector<TParticle*> vpart) {
vector< vector<Step*> > = vvsteps;
//vvsteps goes through physics and gets filled using push_back
//all of vvsteps' entries were filled with objects created with "new"
return vvsteps;
}
每個步驟創建指針到TParticle向量(與新創建的),並且具有以下的析構函數釋放它。
vector<TParticle*> vpart;
Step::~Step() {
for(int i=0; i<vpart.size(); i++) delete vpart[i];
vpart.clear();
}
後,我得到了我想要什麼,我試圖做解除分配整個事情:
vector< vector<Step*> > vvstep = prop->Propagate(vpart);
/*PHYSICS GOES HERE*/
for(int i=0; i<vvstep.size(); i++) {
for(int j=0; j<vvstep[i].size(); j++)
delete (vvstep[i])[j];
vvstep[i].clear();
}
vvstep.clear();
由於某種原因,此代碼不能正常工作。它給我以下錯誤
*** glibc detected *** bin/rtest.exe: double free or corruption (fasttop): 0x0f7207f0 ***
編輯:更正了一個錯字,該類被命名爲步驟,而不是步驟。
考慮使用智能指針來代替執行手動內存通過原始指針,「新」和「刪除」的管理 – 2013-04-07 14:07:59
是'vector> = vvsteps;'一個錯字? –
Beta
2013-04-07 14:13:46
我沒有看到你發佈的代碼存在問題,但是當使用像這樣的指針時,很容易意外地複製指針向量,然後嘗試刪除副本以及原始副本。如果您可以發佈一個獨立的示例,我們可能可以找出問題所在。 – 2013-04-07 14:16:50