C ++如何自动调用析构函数?
在C ++中,我们可以按对象管理资源,即在Ctor中获取资源,并在Dtor(RAII)中释放资源。 这依赖于C ++的自动析构函数调用。 但是,这是如何完成的? 例如,C ++如何知道为c1
调用Dtor而不是c2
。 (我知道这一定是以前的答案,但是我的所有搜索都以解释如何使用RAII的主题结束)。 谢谢!
class Cat;
Cat c1;
Cat* c2 = new Cat();
编辑:我知道我需要调用删除c2
。 我只是不明白当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();
}
链接地址: http://www.djcxy.com/p/84321.html