簡體   English   中英

關於析構函數調用的困惑

[英]Confusion about destructor's calling

在 object 被銷毀之前或在 object 被銷毀之后,是否調用了析構函數? 我認為它是在 object 被破壞之前調用的,因為在 object 被破壞之后,我們無法訪問 memory 以釋放其中的任何資源,但如果我錯了,請糾正我,以便我可以理解

#include <iostream>
#include <cassert>
#include <cstddef>
class Check
{
public:
    int neu{};
    Check() = default;
    Check(int n)
    {
        neu = n;
    }
    void print()
    {
        std::cout << neu << std::endl;
    }
    ~Check()
    {
        std::cout << "It has been destroyed "<<neu <<std::endl;
    }
};
int main()
{
    Check let,see(30);
    let.print();
    return 0;
    // does destructor gets called here
} // or does destructor gets called herecode here

在 object 被銷毀之前或在 object 被銷毀之后,是否調用了析構函數?

當調用析構函數時,object 的生命周期已經結束。 object 被析構函數破壞。

    // does destructor gets called here
} // or does destructor gets called herecode here

真的沒有什么實際的區別。

自動對象在塊內是活動的,它們在塊外是不活動的。 退出塊時,對象將被銷毀。 因此,可以合理地說它們在右大括號所在的位置被銷毀。

來自 ISO 標准(特殊成員函數-析構函數):

一旦為 object 調用析構函數,object 就不再存在; 如果為生命周期已結束的 object 調用析構函數,則行為未定義。

析構函數調用本質上是描述需要考慮object被破壞的動作。 可以顯式調用析構函數,它會導致 object 的生命周期結束。 顯式調用很少見,通常用於放置 new 創建的對象。

鑒於提供的示例,問題實際上是關於析構函數調用的順序。 之后調用子對象的析構函數(包括基類類型,如果有的話)。 因此,您可以安全地訪問它們,直到從析構函數中退出。 調用順序是基於聲明順序的,就像初始化的順序一樣,但是倒過來了。 基類類型的子對象被認為是第一個初始化和最后一個銷毀。

暫無
暫無

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

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