如果我使用new
操作的方法來創建這樣一個對象:我是否需要刪除對象?
void functionA(){
ClassA *a = new ClassA();
}
我需要使用下面的代碼來釋放它?
delete a;
C++能否自動釋放ClassA對象的內存?當它用完了functionA範圍。
如果我寫這樣
void functionA(){
ClassA a = ClassA();
}
代碼做了自動退出?
如果我使用new
操作的方法來創建這樣一個對象:我是否需要刪除對象?
void functionA(){
ClassA *a = new ClassA();
}
我需要使用下面的代碼來釋放它?
delete a;
C++能否自動釋放ClassA對象的內存?當它用完了functionA範圍。
如果我寫這樣
void functionA(){
ClassA a = ClassA();
}
代碼做了自動退出?
爲:
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
內的某個字段仍然可能會泄漏。
請注意,Class a = ClassA()的語義幾乎肯定與OP期望的不同。 –
我是否需要使用以下代碼才能發佈它?
是的,你必須發佈每個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(); }
代碼做了自動退出?
是的,它的確如此。
您可以使用std::unique_ptr
自動做到這一點:
void functionA() {
std::unique_ptr<ClassA> a(new ClassA());
// don't release
}
是的,你需要刪除的任何動態分配的原始指針。如果您想在超出範圍時自動銷燬它,可以在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
void functionA(){
ClassA a = ClassA();
}
呃,爲什麼還要寫呢?它效率低下,令人困惑並且完全沒有必要。有什麼不對:
void functionA() {
ClassA a;
}
一般來說,如果你使用new
您必須使用delete
當你不再需要你用new
分配的實例。當然也有例外,但現在你不必擔心它們。現在只要記住:如果你分配它,用new
你擁有它,並且必須用delete
釋放它。
這是回答在任何好的[初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – GManNickG
我認爲是的,因爲C++沒有自動垃圾回收 – pinkpanther
@pinkpanther,它的確稱爲RAII。而且C++ 11支持GC。 – chris