2017-07-11 5 views
-2

私はこのコードを持っています。出力は〜A〜A〜AprintA〜AprintA〜AprintA〜Aです。私はprintA〜AprintA〜AprintA〜A(3 push_backを持っているからです)を印刷する理由を理解していますが、なぜ文章の始めに3回現われているのか分かりません。v.push_back(a);(ちょうどこれが、他の2つのpush_backsなし)、 "〜A"は表示されません、なぜですか?デストラクタをC++で印刷する

#include<vector> 
#include<iostream> 
    class A { 
    public: 
     virtual void print() { 
      std::cout << "printA"; 
     } 
     virtual ~A() { 
      std::cout << "~A"; 
     } 
    }; 



int main() { 
    std::vector<A> v; 
    A a; 
    A b; 
    A c; 
    v.push_back(a); 
    v.push_back(b); 
    v.push_back(c); 
    for (auto e : v) 
     e.print(); 

     } 
+0

再配置;ループ内でコピーを作成します。 – LogicStuff

+4

あなたの質問は間違って書式設定されています。それを修正してください。 – StoryTeller

+1

...あなたの出力書式も最高です。各coutの後に\ n "'を置くと読みやすくなります – user463035818

答えて

2

オブジェクトをベクトルにプッシュバックすると、size()が増加します。そして、十分なオブジェクトがpush_back()によって追加された場合(この場合、最初のオブジェクトの後に1つしか必要ありません)、capacity() < size() + 1がtrueになると、ベクトルはより多くの要素を保持できるように容量が増加しなければなりません。これはデストラクター呼び出しが表示されている理由です。

reserve(new_cap)を使用して、それに添加する前に、ベクトルの容量を増やしてみてください、あなたはデストラクタの呼び出しが発生しないことがわかります:

std::vector<A> v; 
v.reserve(10); 
A a; 
A b; 
A c; 
//etc.. 

これは起こらなかったあなただけのバック1を押したときなぜなら、再作成されなければならないベクトルに何も含まれていなかったからです。