2010-08-11 52 views
2

下面的「刪除」語句是否「雙重釋放」一個對象?「刪除」語句是否會雙倍釋放一個對象?

(...object_list is a global vector<object*>...) 

vector< object * >::iterator  it, eit, iter; 
object *p_object; 
vector< object * > dead_objects; 

it = object_list_.begin(); 
eit = object_list_.end(); 

//---collect pointers of all dead objects to dead_objects vector 
for (; it != eit; it++) 
{ 
    p_object = *it; 
    if (p_object->is_dead() == false) 
     continue; 

    dead_objects.push_back(p_object); 
} 

//---free every dead object from the global object_list 
for (iter = dead_objects.begin(); iter != dead_objects.end(); iter++) 
{ 
    p_object = *iter; 

    it = object_list_.begin(); 
    eit = object_list_.end(); 

    for (; it != eit; it++) 
    { 
     if (*it != p_object) 
      continue; 

     object_list_.erase(it); 
     delete p_object; 
     break; 
    } 
} 

我問這個問題,因爲erase()上述聲明應該稱爲對象的析構函數和釋放它已經,不應該嗎?

回答

2

erase()不會調用該對象的析構函數,但一個指針類型(如object *這裏)的析構函數什麼也不做 - 它不會調用刪除指針。如果你想要它調用刪除,你需要使用一些調用刪除的對象(如auto_ptr<object *>)。

+0

謝謝你的回答! 我有這個問題,因爲在另一個程序中,我使用地圖,當我調用erase()從地圖中刪除對象*時,我解引用了一個對象*時程序崩潰。 (我正在使用VC++ 6),所以我想知道是否矢量 .erase()也釋放了對象。 – cow 2010-08-11 02:17:03

0

它看起來不是;如果你有一個指向對象的指針向量,調用erase()來刪除它們中的一個就可以從vector中移除指針。您仍然需要自己刪除它 - 這是因爲STL容器主要是爲了按值收集對象而設計的。

只是一些建議 - 國際海事組織你的代碼會更清晰,如果你使用STL算法,如std::find,而不是手動循環所有的載體。我不確定dead_objects vs object_list的含義是什麼 - 通過將它們存儲在臨時向量中,你似乎沒有獲得任何東西,但是將代碼複製到SO中可能會丟失一些東西。並且std::vector對於像這樣的大量隨機刪除並不是最佳的,因爲erase以線性時間運行 - std::remove,然後是erase將是更有效的方法。例如:

for(vector<object*>::iterator it = object_list.begin(); it != object_list.end(); ++it) { 
    if((*it)->is_dead()) { 
     delete *it; 
     *it = NULL; 
    } 
} 
object_list.erase(std::remove(object_list.begin(), object_list.end(), NULL), object_list.end()); 
+0

謝謝你的回答!但不是你最後的陳述 object_list.erase(std :: remove(object_list.begin(), object_list.end(),NULL),object_list.end()); 擦除所有物體,死去還活着? – cow 2010-08-11 02:10:08

+0

否 - 'remove'從列表中刪除等於NULL的所有元素,並將迭代器返回到最後一個有效元素之後。然後'erase'調用將該向量截斷爲這個新的長度。 – Peter 2010-08-11 02:22:26

+0

我明白了。感謝截斷的絕招! – cow 2010-08-11 02:38:29

相關問題