2016-09-18 9 views
1

を呼び出すI持って次のコード:ベクトルのコンストラクタ/デストラクタは

#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 

なぜ私は1つのコンストラクタとデストラクタ4と呼ばれると思いますか?

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の3つのインスタンスのベクトルを構築すると、デフォルト値が設定されます。デフォルト値は、ベクトルコンストラクタ引数から取得されます。あなたはそれを提供していないので、引数のないコンストラクタか、デフォルトの引数値を持つコンストラクタによって構築されます。後者を提供したので、最初のコンストラクタが呼び出されます。

3つの要素はすべてコピー生成されているので、コンストラクタは呼び出されません。

次に、デフォルト値のインスタンスが破棄されるため、最初のデストラクタです。

次に、デストラクタを3回呼び出す3つのインスタンスをすべて削除するベクターを削除します。

自分のためにしてみてくださいまたはこのサンプルを試してみ関数でthisの印刷値を試してみてください。http://coliru.stacked-crooked.com/a/903fa70484f5c3bc

+1

<< this << endl;に 'A(const A&o){cout <<"コピーコンストラクタを追加する。 } 'この答えを確認します。 –

+0

注:C++ 11では、OPコードに見られるように、ベクトル構成のコピーを構築することを禁止しましたが、呼び出し側がイニシャライザを提供しなかったときに各エントリをデフォルトで構築する必要があります。 –

関連する問題