创建指针时是否没有构造函数调用?

时间:2017-06-18 08:13:46

标签: c++ pointers constructor delete-operator

当我运行这个程序时,类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

1 个答案:

答案 0 :(得分:2)

a1是一个普通的旧变量,所以当你声明它时,会调用构造函数。 ap是一个指针变量,因此声明它或赋值给它不会调用任何构造函数。 ap只是指向a1的指针。

当您显式删除ap时,将调用析构函数,并且当a1超出范围时,将再次调用析构函数。如注释中所述,在未使用delete初始化的指针上调用new是错误的,并且将导致未定义的行为。