C++:析构函数如何在内部工作以及谁调用默认的析构函数?

1 c++ destructor

class A
{
    public:
    A()
    {
       std::cout << "I am ctor\n";
    }
    ~A()
    {
       std::cout << "I am dtor\n";
    }
    void printme()
    {
       std::cout << "I am printme\n";
    }
};

int main()
{
   A aobj;
   aobj.printme();
   aobj.~A();
   aobj.printme();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

$./testdtor
I am ctor
I am printme
I am dtor
I am printme
I am dtor
Run Code Online (Sandbox Code Playgroud)

对析构函数的显式调用行为类似于普通函数调用,一旦对象超出作用域,就会调用析构函数,但我想知道哪个实体?

bob*_*bah 6

编译器为所有自动对象生成析构函数调用代码.以与对象构造顺序相反的顺序调用这样的析构函数.

delete话务员通话对象的析构驻留在该地址指向的对象由操作参数,通常是(我要说总是与动态对象使用).

这种行为允许可靠的内存管理和我们非常喜欢的许多其他有用的技巧C++.

您可能并且在大多数情况下手动调用析构函数的唯一情况是使用placementnew运算符分配对象时.

  • 为了避免混淆,我会使用"自动"和"动态"而不是"堆栈"和"堆". (3认同)

Mik*_*our 6

这取决于对象的位置以及对象的生命周期.

  • 对于像您的示例那样的自动变量,通过在其范围结束时生成的代码
  • 对于静态变量,由结束atexit后的机制调用的代码main
  • 对于线程局部变量,在线程结束后通过类似的机制
  • 对于非静态类成员变量或基础子对象,通过在包含它的类的析构函数中生成的代码
  • 对于new由相应的delete-expression生成的代码创建的对象
  • 对于由placement-new创建的对象,只能显式调用析构函数.