ベクトルテンプレートが2つの割り当てを実行するのはなぜかというと、1つだけが であると思われていたのです。STLベクトル割り当て
#include <vector>
#include <iostream>
class A {
public:
A(const A &a) {
std::cout << "Calling copy constructor " << this << " " << &a << "\n";
}
A() {
std::cout << "Calling default constructor " << this << "\n";
}
~A() {
std::cout << "Calling destructor " << this << "\n";
}
};
int main(int argc, char **argv)
{
std::vector <A> Avec;
std::cout << "resize start\n";
Avec.resize(1);
std::cout << "resize end\n";
return 0;
}
出力:例:このため
resize start Calling default constructor 0x7fff9a34191f Calling copy constructor 0x1569010 0x7fff9a34191f Calling destructor 0x7fff9a34191f resize end
私は思います - 新しいA()の1つ - push_back()のコピーのための1つ – ynimous
@ynimous:実際はそうではありませんが、上記のコードはセマンティクスを変更して、ベクトルにポインタが含まれるようにします。これはポインタを作成してコピーする(これはおそらくより速い)一方、A要素を1回だけ作成します。 –
このアプローチの問題は、コードのセマンティクスを変更していることです。オブジェクトがベクトル内で値で保持される前に、ベクトルの破壊はすべての含まれた要素の破壊を暗示しました。要素がポインタを介して保持されるので、コードは適合されなければならず、ユーザーはすべてのリソース(Aオブジェクト)を手動で破棄する必要があります。 A構造の数を減らしたが、コードはより壊れやすくなり、リソースリークが発生しやすくなった。 –