2013-06-06 113 views
0

如果我使用new操作的方法來創建這樣一個對象:我是否需要刪除對象?

void functionA(){ 
    ClassA *a = new ClassA(); 
} 

我需要使用下面的代碼來釋放它?

delete a; 

C++能否自動釋放ClassA對象的內存?當它用完了functionA範圍。

如果我寫這樣

void functionA(){ 
    ClassA a = ClassA(); 
} 

代碼做了自動退出?

+6

這是回答在任何好的[初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – GManNickG

+0

我認爲是的,因爲C++沒有自動垃圾回收 – pinkpanther

+0

@pinkpanther,它的確稱爲RAII。而且C++ 11支持GC。 – chris

回答

5

爲:

void functionA() { 
    ClassA *a = new ClassA(); 
} 

必須將delete a;在函數內部進行清潔:

void functionA() { 
    ClassA *a = new ClassA(); 
    // your other code here 
    delete a; 
} 

否則你將面臨內存泄漏。這是除非你以某種方式返回a變量或將它傳遞給其他釋放它的地方。

爲:

void functionA(){ 
    ClassA a = ClassA(); 
} 

a,如果你正確地定義它的析構函數會得到 '釋放' 自動。如果在ClassA析構函數中沒有正確清理,那麼a內的某個字段仍然可能會泄漏。

+0

請注意,Class a = ClassA()的語義幾乎肯定與OP期望的不同。 –

3

我是否需要使用以下代碼才能發佈它?

是的,你必須發佈每個new ed對象。

C++能否自動釋放ClassA對象的內存?

你可以使用智能指針:分配給a_ptr

#include <memory> 

void functionA(){ 
    std::unique_ptr<ClassA> a_ptr(new ClassA); 
} 

記憶將再次a_ptr超出範圍自動realeased。

如果我寫這樣

void functionA(){ 
    ClassA a = ClassA(); 
} 

代碼做了自動退出?

是的,它的確如此。

1

您可以使用std::unique_ptr自動做到這一點:

void functionA() { 
    std::unique_ptr<ClassA> a(new ClassA()); 
    // don't release 
} 
1

是的,你需要刪除的任何動態分配的原始指針。如果您想在超出範圍時自動銷燬它,可以在boost庫中使用C++ 11標準中包含的一些智能指針,如[shared_ptr] [1]或[unique_ptr] [2]或[scoped_ptr] [3]

[1]: http://www.cplusplus.com/reference/memory/unique_ptr/ 
[2]: http://www.cplusplus.com/reference/memory/shared_ptr/ 
[3]: http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/scoped_ptr.htm 
3
void functionA(){ 
    ClassA a = ClassA(); 
} 

呃,爲什麼還要寫呢?它效率低下,令人困惑並且完全沒有必要。有什麼不對:

void functionA() { 
    ClassA a; 
} 

一般來說,如果你使用new您必須使用delete當你不再需要你用new分配的實例。當然也有例外,但現在你不必擔心它們。現在只要記住:如果你分配它,用new你擁有它,並且必須用delete釋放它。

相關問題