2013-04-07 82 views
0

我正在創建一個粒子物理模擬器,並且需要進行適當的內存管理。從指針向量中釋放內存

我發現很方便,我的方法一次傳播幾個粒子,所以這個方法返回一個軌跡向量,每個軌跡是一個步驟矢量(因此得到一個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 *** 

編輯:更正了一個錯字,該類被命名爲步驟,而不是步驟。

+6

考慮使用智能指針來代替執行手動內存通過原始指針,「新」和「刪除」的管理 – 2013-04-07 14:07:59

+1

是'vector > = vvsteps;'一個錯字? – Beta 2013-04-07 14:13:46

+1

我沒有看到你發佈的代碼存在問題,但是當使用像這樣的指針時,很容易意外地複製指針向量,然後嘗試刪除副本以及原始副本。如果您可以發佈一個獨立的示例,我們可能可以找出問題所在。 – 2013-04-07 14:16:50

回答

1

您的矢量型的矢量更改爲:

`std::vector< std::vector<std::unique_ptr<Step>>>` 

這做了幾件事情。首先,它會阻止複製你的std::vector,這是不好的,因爲這樣的向量既代表所有權,又代表數據的引用。

move仍然可用,通常應該發生。如果要將一組矢量矢量移動到另一個點,並且不會自動發生,請插入一個std::move(src)

其次,當vectorvector的數據超出範圍時,unique_ptr會自動清除Step對象。

如果您正在調用直接使用Base*的函數,則可能必須在unique_ptr<Base>上插入一些.get()調用。但它本來應該是透明的。

注意,雙缺失可能是存在的,因爲你重複這些vector S的Base*之一 - std::vector<std::unique_ptr<Base>>會抱怨,當你試圖做...