簡體   English   中英

C++如何自動調用析構函數?

[英]How does C++ automatically call destructor?

在C++中,我們可以通過對象來管理資源,即在Ctor中獲取資源,在Dtor(RAII)中釋放。 這依賴於 C++ 的自動析構函數調用。 但這是如何在引擎蓋下完成的? 例如,C++ 如何知道為c1而不是c2調用 Dtor 。 (我知道之前肯定已經回答過這個問題,但我所有的搜索都以解釋如何使用 RAII 的主題結束)。 謝謝!

class Cat;
Cat c1;
Cat* c2 = new Cat();

編輯:我知道我需要為c2調用 delete 。 我只是不明白當c1超出范圍時如何調用 Dtor。

看看編譯器資源管理器 我已經鏈接了您示例的可構建版本。 以防萬一鏈接不是永久的,如果這個答案,我已經在最后復制了代碼。

對於Cat c1; 線(淺紅色)你會看到在 asm 中有三個對應的塊,顏色相同。

lea rax, [rbp-28]
mov rdi, rax
call Cat::Cat()

這與堆棧上對象的構造相匹配。

接下來是

lea rax, [rbp-28]
mov rdi, rax
call Cat::~Cat()

這是正常的返回路徑,自動調用析構函數。

最后有

lea rax, [rbp-28]
mov rdi, rax
call Cat::~Cat()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume

如果拋出異常(例如,通過new ),這是采用的路徑。 它會自動調用析構函數,然后繼續異常。

為了完整起見,這里是 C++ 源代碼:

    class Cat
    {
    public:
        Cat() : meow() {}
        ~Cat() {}
    private:
        int meow;
    };

    void foo()
    {
        Cat c1;
        Cat* c2 = new Cat();
    }

    int main()
    {
        foo();    
    }

暫無
暫無

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

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