2016-09-18 108 views
1

我有以下代码:载体构造函数/析构函数调用

#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。

+4

拷贝构造函数被调用 – Amadeus

+0

即输出[错](http://coliru.stacked-crooked.com/a/4dcfb98936905392)为你列出的上述片段 – WhiZTiM

+0

@WhiZTiM这是不正确的:http://coliru.stacked-crooked.com/a/1ecb4852b136545d输出预计C++ 03 – Amadeus

回答

1

当您构造A的三个实例的向量时,它将填充默认值。默认值取自矢量构造函数参数。你没有提供一个,所以它是由不带参数的构造函数或者带有默认参数值的构造函数构造的。你提供了后者,所以第一个构造函数调用。

所有这三个元素都是复制构造的,所以没有调用你的构造函数。

然后默认值实例被销毁,所以第一个析构函数。

然后你删除矢量,它删除所有三个实例,调用析构函数三次。在功能this

尝试打印值,试图为自己或尝试此示例:http://coliru.stacked-crooked.com/a/903fa70484f5c3bc

+1

在“<< this << endl;”上添加'A(const A&o){cout <<“复制构造函数。 }'确认这个答案。 –

+0

注意:C++ 11取消了在OP代码中看到的复制构造向量条目的做法,现在要求每个条目在调用者没有提供初始化器时都是默认构造的。 –

相关问题