我有以下代码:
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
class A {
public:
int i;
A(int i=0):i(i) {
cout << "A::A() called" << endl;
}
~A() {
cout << "A::~A() called" << endl;
}
};
int main() {
vector<A> *a = new vector<A>(3);
delete a;
}
程序打印:
A::A() called
A::~A() called
A::~A() called
A::~A() called
A::~A() called
为什么我看到一个构造函数和四个析构函数被调用?
我正在使用g ++ 4.8.4。
答案 0 :(得分:1)
当您构造A的三个实例的向量时,它将填充默认值。默认值取自vector构造函数参数。你没有提供一个,所以它是由没有参数的构造函数或带有默认参数值的构造函数构造的。你提供了后者,所以第一个构造函数调用。
所有三个元素都是复制构造的,因此不需要调用构造函数。
然后销毁默认值实例,因此第一个析构函数。
然后删除向量,删除所有三个实例,调用析构函数三次。
尝试在函数中打印this
的值以自行尝试或尝试此示例:http://coliru.stacked-crooked.com/a/903fa70484f5c3bc