如何理解CPP中的调用析构方法?

How to understand call destructor method in CPP?

我想了解 CPP 中的 Destructor 方法。 我已经知道的事实: 一种。实例结束时会自动调用析构方法。 b.如果没有定义明确的析构函数方法,那么编译器将创建一个默认的析构函数(尽管不会完成任何特定任务,例如不清理用户的动态内存。)

所以假设 A 是一个 class 名字,我想知道 class A 的析构函数会被调用多少次:

我现在的理解是"delete []p"的最后一行不能算作析构函数,它只是用来删除动态指针p。 由于 A 的 class 中没有关于是否创建了显式析构函数的信息,我们认为创建了默认的 class 析构函数,因此两次调用 p(因为 A[2] 中有两个元素),并且p2一次,共三次

不知道上面说的对不对。希望这里的 CPP 大师能帮助我。谢谢!!

int main(){
    A *p = new A[2];
    A * p2 = new A;
    A a;
    delete []p;
}

对于 class 的每个实例,析构函数将被恰好调用一次。我排除了程序终止的边缘情况,使整个过程在不调用突出对象的析构函数的情况下消失(没有意义)。

在您的示例中,p 是指向包含 class 的两个实例的数组的指针。 delete[] p 将销毁 class 的两个实例。每个被销毁的对象都会调用 class 的析构函数一次,总共调用两次。 p2 是指向 class 的一个实例的指针,但由于它不是明确的 deleted,因此该实例属于边缘情况。最后,在函数自动作用域中有一个 class 的实例。当执行离开函数范围时,该实例被销毁,因此这是另一个析构函数调用。

无论 class 是否具有默认析构函数或显式声明的析构函数,都没有区别。无论 class 有什么析构函数,都会调用该析构函数。

现在,请记住,即使析构函数在这里被多次调用,它也会在 class 的每个实例被销毁时恰好被调用一次,并且您有多个实例。