[英]C++: why it doesn't call a destructor?
我在代碼中使用了多余的括號。 我以為應該在局部變量作用域結束后何時調用析構函數,但它不能像這樣工作:
class TestClass {
public:
TestClass() {
printf( "TestClass()\n" );
}
~TestClass() {
printf( "~TestClass()\n" );
}
};
int main() {
int a, b, c;
{
TestClass *test = new TestClass();
}
}
它輸出:
TestClass()
所以它不調用TestClass的析構函數,但是為什么呢? 如果我手動調用它(刪除測試),它將調用析構函數。 但是,為什么在第一種情況下它不調用析構函數?
TestClass *test = new TestClass();
您使用new
創建一個動態分配的對象(最有可能放在堆中)。 這種類型的資源需要由您手動管理。 通過管理,使用完后應在其上使用delete
。
{
TestClass *test = new TestClass();
// do something
delete test;
}
但是對於大多數目的和意圖而言,您只需要使用自動存儲對象即可,這使您不必手動管理對象。 它還最有可能具有更好的性能,尤其是在壽命短的對象中。 除非您有充分的理由不這樣做,否則您應該始終喜歡使用它們。
{
TestClass test;
// do something
}
但是,如果您需要動態分配的對象或指針的語義,最好使用某種機制為您封裝對象/資源的刪除/釋放,這也為您提供了額外的安全性,尤其是在使用時例外和條件分支。 就您而言,最好使用std::unique_ptr
。
{
std::unique_ptr<TestClass> test(new TestClass());
// auto test = std::make_unique<TestClass>(); in C++14
// do something (maybe you want to pass ownership of the pointer)
}
這個答案已經足夠好了,只是增加了一些。
我看到您已經使用Java
進行了編碼。 在C++
,不需要在堆棧中創建變量/對象關鍵字new
。 實際上,當您使用關鍵字new
對象是在堆中創建的,並且在離開作用域后不會銷毀。 要銷毀它,您需要在您的案例delete test;
調用delete
delete test;
在您這樣的結構中,離開作用域后,您只會丟失指向對象的指針,因此,離開作用域后,您將無法釋放內存並調用析構函數,但最終在執行exit()
指令之后,OS會調用析構函數。
總結C++
!= Java
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.