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

上一篇: How does C++ automatically call destructor?

下一篇: optimizing recursive calls in C