2016-09-18 94 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代碼中看到的複製構造向量條目的做法,現在要求每個條目在調用者沒有提供初始化器時都是默認構造的。 –