2013-03-31 68 views
2

我剛剛學習C++,來自對C和Java的理解。我不完全理解爲什麼我寫的一些代碼不會泄漏內存。下面的代碼:爲什麼不需要手動釋放載體?

// Foo.h 
class Foo { 
private: 
    std::vector<int> v; 
public: 
    Foo(); 
    virtual ~Foo(); 
    void add_int(int); 
} 

// Foo.cpp 
Foo::Foo(): v() {} 
Foo::~Foo() {} 

Foo::add_int(int x) { 
    v.append(x); 
} 

存儲在v矢量顯然在內部存儲一個指向堆分配的內存,它需要被釋放,但我從來沒有免費的。然而,Valgrind說使用這個代碼根本不會泄漏。我覺得這種理解爲什麼會有助於提高我對語言的理解。

+0

代碼是否泄漏取決於您如何使用它。 –

+0

否'new' ==否'delete'。就這麼簡單。該向量通過其析構函數釋放內存。 –

回答

6

祕密是C++的析構函數。你寫了一個「什麼都不做」(~Foo),但在C++中,當類被銷燬時,成員變量會自動被銷燬。

vector的析構函數簡單地銷燬每個包含的元素,然後釋放其內部數組。

+0

它還會調用內部數組中任何元素的析構函數。 –

+0

@JamesKanze:謝謝,補充回答。 – nneonneo

+0

有趣的是,如果我有一個指向兩個不同向量中的同一個對象的指針,那麼釋放其中一個,另一個會被打破?如果矢量包含「int」或其他沒有析構函數方法(或任何方法)的東西,該怎麼辦?你確定矢量的析構函數調用矢量中所有東西的析構函數嗎? – adrusi

2

您沒有動態分配vnew,所以沒有必要delete它。

C++保證當Foo實例被銷燬時,會自動銷燬成員變量,並且向量將它自己的事務整理出來。

1

vector類的析構函數將釋放時,矢量對象被銷燬的內存(和本身會當你的Foo對象被銷燬被銷燬的矢量對象)

0

因爲你在棧中分配的載體,當富去超出範圍所有它的堆棧變量將自動調用它們的析構函數。當在矢量上調用析構函數時,它將調用其中所有元素的析構函數。

如果您在堆上分配了矢量,您將不得不手動調用其上的刪除或更好,但仍可以使用智能指針自動處理。

相關問題