2013-01-16 7 views
6

私のプログラムで何かが起きました。起こるかどうかはわかりません。それがあれば、私は理由が表示されない...ここで オブジェクトのベクトルを初期化およびサイズ変更するときにデストラクタが呼び出されるのはなぜですか?

はコードです:

#include <iostream> 
#include <vector> 

using namespace std; 

class A{ 
    public: 
    A(); 
    ~A(); 
}; 

A::A(){ 
    cout << "creating" << endl; 
} 

A::~A(){ 
    cout << "deleting" << endl; 
} 

int main(void){ 
    vector<vector<A > > vec; 

    vec.resize(5); 
    for(int i = 0; i < 5; ++i){ 
    vec[i].resize(5); 
    } 

    cout << "END" << endl; 

    return 0; 
} 

そして、ここでは出力です:私は、デストラクタが後に呼び出される理由を理解

creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
END 
deleting 
deleting 
[..more deleting here] 

」 END "メッセージが表示されますが、以前は表示されません。私は、ベクトルのサイズを変更すると、クラスのコンストラクタが呼び出されますが、デストラクタはなぜですか?

+0

コピーctorをユーザー定義するのを忘れました。 resize()を呼び出すたびに出力を行い、出力を行うと、何が起きているのかがわかります。 –

答えて

17

C++ 03 vector<A>::resize()にはデフォルトのパラメータがあり、デフォルト値はA()です。この一時的なものは破壊されています。ベクトルの要素は、それからコピー構築されます。

これは、C++ 11では「固定」で、2つのオーバーロードがresizeである。 1つはパラメータを持ち、付加的な要素はすべて値を初期化します。もう1つは2つのパラメータを持ち、追加された各要素を指定された値からコピー初期化します。 C++ 11本プログラムでは、この動作があります。Aのインスタンスは、それが数を最小限に価値があることを構築するためにとても衝撃的な高価である場合、C++ 03では

creating 
creating 
creating 
<repeated for a total of 25 "creating"s> 
creating 
creating 
creating 
END 
deleting 
deleting 
deleting 
<repeated for a total of 25 "deleting"s> 
deleting 
deleting 
deleting 

を、あなたは5なしからそれを剃ることができ1まで-args- + 25コピー構造無arg-ないと25コピーの構造このようなもので:

A default_value; 
for (int i = 0; i < 5; ++i) { 
    // same end result as vec[i].resize(5) 
    if (vec[i].size() >= 5) { 
     vec[i].erase(vec.begin() + 5, vec.end()); 
    } else while(vec[i].size() < 5) { 
     vec[i].push_back(default_value); 
    } 
} 

あなたは、おそらく若干異なり、それを書くことができ、かつ、明らかにあなたの例のコードのために、あなたはしないでください"if"の場合が必要です。しかし、私は "else while"と言う機会が多くないので、私はそれを取っています。

+0

このコードはC++ 11ではまったく異なるように動作することに言及することは重要です。 – Csq

+0

@Csq:うん、私はあなたの道のりです。 「ウェイ」の値が「かろうじて」に等しい。私はちょうどそのビットを投稿する前に標準をチェックしていました:-) –

+0

さて、C++ 11なしで修正する方法はありません。ありがとう:) – user1729422

関連する問題