2012-06-01 61 views
1

可能重複:
how to properly delete pointer?刪除矢量指針的最佳方法是什麼?

我使用std::vector把一組對象到它供以後使用,我使用DETAIL* pPtr = new DETAIL創建的指針,然後將其插入到矢量中。

DETAIL的結構

struct DETAIL { 
    int nRef; 
    short sRandom; 
}; 

這是刪除並沒有留下餘地內存泄漏矢量內擦除指針的最佳方式?

while(Iter1 != m_Detail.end()) 
{ 
    if((*Iter1)->nRef == m_SomeVar)  
    { 
     delete *Iter1; 
     m_Detail.erase(Iter1); 
     break; 
    } 

    Iter1++; 
} 
+3

維持指向矢量和/或指針類型向量的指針幾乎總是錯誤的。 (幾乎總是。不要這樣做。 –

+1

幾個小時前沒有問過這個問題嗎? http://stackoverflow.com/questions/10854274/how-to-properly-delete-pointer – PermanentGuest

+0

如果你的向量包含原始指針,那麼當例如向量被異常銷燬時,絕對沒有辦法保護它。泄漏的可能性始終存在。 –

回答

9

不要把原始指針到vector,而是使用智能指針如std::shared_ptr。那麼就不需要delete,只需erase指針從vector指向的對象將被自動刪除。

-2

我不知道我是否完全理解它,但你有沒有嘗試過使用ZeroMemory宏?

+2

我不明白這個迴應。 –

+0

MSVC宏中的ZeroMemory僅用於將連續內存塊設置爲0.這不能與std容器一起使用。 – Plexico

0

我的建議是使用std :: shared_ptr從使用擦除的向量中移除共享指針並讓它處理重新分配。然而,你在做什麼沒有問題,但擦除不會導致向量釋放它分配來容納指針的空間。您可以使用shrik_to_fit刪除分配的空間。

0

我使用DETAIL* pPtr = new DETAIL創建指針

這是你的第一個錯誤,你獲取資源(從的FreeStore和內存構造一個對象存儲),而不是初始化對象將取得所有權並保證釋放您獲得的資源。解決第一個錯誤的成語叫做​​。

它應該是這樣的:

std::shared_ptr<DETAIL> pPtr(new DETAIL); 

或者更好的是:

std::shared_ptr<DETAIL> pPtr = std::make_shared<DETAIL>(); 

還是在C++ 03與boost::shared_ptr(和boost::make_shared

下一個錯誤是取代std::shared_ptrdelete *Iter1;,因爲幾乎所有在析構函數之外使用delete的代碼都是錯誤的(並且全部在析構函數外部使用delete的代碼,伴隨有關於如何避免內存泄漏的問題肯定是錯誤的。)如果使用RAII語言,則不需要使用delete,因爲它會在正確的時間自動發生。

另外,爲什麼您的課程名爲DETAILDetail有什麼不對嗎?

0

我不喜歡像「永遠不會做」的答案,所以我會回答,但會給你一些技巧來繞過釋放矢量而不釋放內容的風險。

如果我沒有理解好,你有細節圖指針的向量:

std::vector<DETAIL*> details; 

所以,你想一個方法來刪除,並刪除它是指在一定m_SomeVar所有尖銳的物體:(現在讓我們想象這是一個免費的函數)

void free_references(int reference, std::vector<DETAIL*> & vector) 
{ 
    std::vector<DETAIL*>::iterator it = vector.begin(); 

    while (it != vector.end()) 
    { 
     if ((*it)->nRef == reference) 
     { 
      delete *it; 
      // erase() makes the original 'it' in an unknown state which can't be used 
      // erase will return a valid iterator which is, in this case, the following element 
      it = vector.erase(it); 
     } 
     else 
     { 
      ++it; 
     } 
    } 
} 

正如我在你的代碼中所理解的,向量是一個類的成員。這是很好的,因爲你可以刪除析構函數中的所有內容。

但是,我會在這裏使用std::unique_ptr來將指針的所有權「指派給vector中的unique_ptr容器。當矢量內存空閒時,智能點確保所擁有的尖端對象被釋放。

相關問題