2
TestDelete::TestDelete(int i) {
    this->i = i;
    std::cout <<"TestDelete constructor for "<<this->i<<"\n";
}

TestDelete::~TestDelete() {
    std::cout <<"TestDelete destructor for "<<this->i<<"\n";
}

int main () {
  std::vector<TestDelete> pt;
  pt.push_back(TestDelete(1));
  pt.push_back(TestDelete(2));

  return 0;
}

上記のコード スニペットは以下のように出力されます

1 の TestDelete コンストラクター

1 の TestDelete デストラクタ

2 の TestDelete コンストラクター

1 の TestDelete デストラクタ

2 の TestDelete デストラクタ。

1 の TestDelete デストラクタ。

2 の TestDelete デストラクタ。

の実装はpush_backコピースワップの概念に基づいていることを理解しています。これにより、一時オブジェクトのコンストラクターとデストラクタが呼び出されます。しかし、デストラクタへの余分な呼び出しが行われていることに気付いた場合object1

誰かがここで何が起こっているのか説明できますか?

4

3 に答える 3

2

3 のルールに違反しており、オブジェクトの 1 つがコピーされ、そのコピーのデストラクタが表示されています。

ロギングを使用してコピー コンストラクターとコピー代入演算子を追加すると、理解できる動作が表示されます。

編集:コメントでこの回答に人々が混乱しているため、これは何も問題がないことを示すためのものでありログを使用して CC/CAO を追加すると、すべてのオブジェクトが正しく作成/割り当て/破棄されることがわかります。 . プログラムの正確さには CC/CAO は必要ありません。std::vector が以下に示す順序で作成/割り当て/破棄している理由について、以下により良い回答があります。混乱を招きましたことをお詫び申し上げます。

于 2013-05-23T08:37:37.860 に答える
0

これは、std::vectorのサイズ変更ポリシーによるものです。それからそれは満たされ、何らかの要因で成長します。これには、新しいメモリ割り当て + 古いメモリ割り当て解除 (したがって、デストラクタの呼び出し) が必要です。

たとえば、事前にメモリを予約すると、サイズ変更は行われません。

$ 猫 main.cpp

#include <iostream>
#include <vector>

class TestDelete {
public:
        TestDelete(int);
        ~TestDelete();

        int i;
};

TestDelete::TestDelete(int i) {
    this->i = i;
    std::cout <<"TestDelete constructor for "<<this->i<<"\n";
}

TestDelete::~TestDelete() {
    std::cout <<"TestDelete destructor for "<<this->i<<"\n";
}

int main () {
  std::vector<TestDelete> pt;

  pt.reserve(10); // reserve memory for 10 objects
  pt.push_back(TestDelete(1)); // so no resize would be needed
  pt.push_back(TestDelete(2));

  return 0;
}

$ ./a.out

TestDelete constructor for 1 // temporary object constructed
TestDelete destructor for 1  // temporary object destructed
TestDelete constructor for 2  // temporary object constructed
TestDelete destructor for 2  // temporary object destructed
TestDelete destructor for 1  // vector destructed
TestDelete destructor for 2 // vector destructed
于 2013-05-23T08:58:36.880 に答える