2011-08-29 61 views
0

說我有以下類:默認析構釋放的類的陣列成員,C++

class A {}; 

Class C { 
private: 
    A a[10]; 
}; 

int main() { 
    C c; 
} 

將這個代碼導致內存泄漏?如在中,編譯器將爲C類定義的缺省析構函數是否可以成功釋放A對象數組的內存?

我想檢查自己,但我無法弄清楚如何在OSX 10.7 Valgrind的運行...

+0

「class A」是一個空類嗎? – Stan

+0

@Stan:看看代碼,'A'看起來確實是空的。但是,這對泄漏沒有任何影響。 –

+0

@ phresnel - 我明白了。我只是想知道azphare在'A'中遺漏了什麼。 – Stan

回答

2

這不會泄漏。如果你想確認,在A的析構函數中加入一條調試語句。

編輯:簡單的例子...

#include <iostream> 

class A 
{ 
public: 
    A() { std::cout << "A::A()" << std::endl; } 
    ~A() { std::cout << "A::~A()" << std::endl; } 
}; 

Class C { 
private: 
    A a[10]; 
}; 

int main() { 
    C c; 
} 

現在編譯和運行上面的例子中,應該產生第一調試語句的10個實例和第二調試語句的10個實例。當銷燬A的10個實例時會生成最後10條語句(這是爲您自動完成的 - 因此,術語自動存儲器,當它們超出範圍時 - 在這種情況下,即當C [其中擁有它們]超出範圍[在main的末尾]。)

+1

好吧,因爲數組的內存分配在堆棧上,所以當main()完成執行時它會被釋放(對嗎?)能否告訴我你在A的析構函數中的調試語句是什麼意思?我不知道我的理解...... – azphare

+0

'A ::〜A(){std :: clog <<「破壞A處於」<< static_cast (this)<< std :: endl;}'。這將證明'C c'內的所有10個對象都被銷燬。 – MSalters

+0

非常感謝:) – azphare

2

沒有也不會造成內存泄露。這些類根本不使用新的,所以沒有在堆中動態分配內存。

2

內存泄漏問題僅出現在動態內存分配上。對於自動分配的內存(通常在堆棧或數據段)沒有內存泄漏。