当我运行这个程序时,类A的析构函数被调用两次,但构造函数被调用一次。
#include<iostream>
using namespace std;
class A{
public:
A(){cout<<"constructor\n";}
~A(){cout<<"destructor\n";}
};
int main()
{
A a1;
A *ap=&a1;
delete ap;
return 0;
}
输出:
constructor
destructor
destructor
答案 0 :(得分:2)
a1
是一个普通的旧变量,所以当你声明它时,会调用构造函数。 ap
是一个指针变量,因此声明它或赋值给它不会调用任何构造函数。 ap
只是指向a1
的指针。
当您显式删除ap
时,将调用析构函数,并且当a1
超出范围时,将再次调用析构函数。如注释中所述,在未使用delete
初始化的指针上调用new
是错误的,并且将导致未定义的行为。