2013-07-06 67 views
0

我有一個問題,我無法在任何地方找到答案。然而,有一些代碼,我必須表明:刪除包含動態指針的STL :: list <class something>的類別

#include "Vector2D" 

    class something 
    { 
     Vector2D * p_Position; 
     public: 
     something(){p_Position = new Vector2D;} 
     ~something(){delete p_Position;} 
    }; 

    int main() 
{ 
    std::list<something> Somethinglist; 

    Somethinglist.push_back(something()); 

    Somethinglist.clear(); 
    return 0; 
} 

所以,這將導致一個斷言,當涉及到.clear()功能失效。所以我嘗試了一些東西。首先,如果我只是不把delete p_Position放在解構器中,這個代碼完全可以工作。這是爲什麼? STL列表.clear()函數是否會自動銷燬動態指針?或者一個相當直接的問題:我該如何解決這個問題?

回答

1

首先,如果我只是不把刪除p_Position放在解構器中,這個代碼完全可以工作。

因爲如果你沒有把它放在析構函數中,p_Position將不會被釋放。它會導致內存泄漏。

這是爲什麼。 STL列表.clear()函數是否會自動銷燬動態指針?

STL容器保留原始對象的副本。當.clear()時,這些對象將被釋放並且它們的析構函數將被調用。

或者一個相當直接的問題:我該如何解決這個問題?

按照Rule of Three.

或使用智能指針

#include <memory> 
class something 
{ 
    std::unique_ptr<Vector2D> p_Position; 
    public: 
    something(){} 
    ~something(){} 
}; 

或使用它沒有指針

class something 
{ 
    Vector2D p_Position; 
    public: 
    something(){} 
}; 
+0

好的,非常感謝很多人,三項規則是解決問題的方法之一,它現在可行! –

5

std::list::push_back()以價值爲參數(即生成副本),這是一個真正的問題,因爲您沒有遵循Rule of Three

+0

我總是在想爲什麼不設計成語言std容器可以將**引用**保存到添加到它們的對象中。 (我明白,因爲它目前站立,這是不可能的,因爲動態內存管理是必需的**和**我們不能指向引用,但stil ...) – 2013-07-06 05:03:26

+0

如此基本,我想要做的不是可能? –

+1

@TilmanZuckmantel:你讀過我鏈接的問題/答案嗎? –