[英]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.