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

时间:2016-10-08 03:59:20

标签: c++ destructor

我试图了解CPP中的Destructor方法。 我知道事实: 一个。当实例结束时,将自动调用析构函数方法。 湾如果没有定义明确的析构函数方法,那么编译器会创建一个默认的析构函数(虽然不会执行任何特定任务,例如不清理用户的动态内存。)

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

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

我不确定上述是否正确。希望这里的CPP大师可以帮助我。谢谢!

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

1 个答案:

答案 0 :(得分:0)

对于每个类的实例,析构函数将被调用一次。我排除了程序终止的边缘情况,使整个过程消失而不调用任何对象的析构函数(没有指向它)。

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

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

现在,请记住,尽管析构函数在这里被多次调用,但是对于每个被破坏的类的实例,它只被调用一次,并且你有多个实例。