簡體   English   中英

C ++:為什么不調用析構函數?

[英]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)
}


以下是一個相關鏈接,可幫助您決定使用自動存儲對象還是動態分配的對象: 為什么C ++程序員應盡量減少對“ new”的使用?

因為您有一個指向動態分配對象的指針。 只有指針超出范圍,而不是指針指向的對象。 您必須在指針上調用delete才能調用被指針的析構函數。

請嘗試使用自動存儲對象:

{
  TestClass test;
}

在這里,析構函數在退出范圍時被調用。

不建議在C ++中使用原始指針指向動態分配的對象,因為它很容易導致資源泄漏,如代碼示例中所示。 如果確實需要指向動態分配對象的指針 ,明智的做法是使用智能指針處理它們,而不是嘗試手動處理它們的破壞。

這個答案已經足夠好了,只是增加了一些。

我看到您已經使用Java進行了編碼。 C++ ,不需要在堆棧中創建變量/對象關鍵字new 實際上,當您使用關鍵字new對象是在堆中創建的,並且在離開作用域后不會銷毀。 要銷毀它,您需要在您的案例delete test;調用delete delete test;

在您這樣的結構中,離開作用域后,您只會丟失指向對象的指針,因此,離開作用域后,您將無法釋放內存並調用析構函數,但最終在執行exit()指令之后,OS會調用析構函數。

總結C++ != Java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM