最近、私はunique_ptr
の使用法について学びました。STLコンテナのストアバイバリューの性質から生まれるコピーオーバーヘッドを取り除くことを望んでいました。しかし、私は本当に奇妙な動作に遭遇し、理由を理解できませんでした。ベクトル内の "unique_ptr"の予期せぬオーバーライト
struct LargeObj
{
int id;
LargeObj(int _id) : id(_id)
{
cout << "[" << this << "] is constructed\n";
}
~LargeObj()
{
cout << "[" << this << "] is destroyed\n";
}
// Simulate huge data size
int data[10000];
};
int main(int argc, char **argv)
{
vector<unique_ptr<LargeObj>> store_by_pointer;
for (int i = 0; i < 10; i++)
{
LargeObj obj(i);
store_by_pointer.push_back(unique_ptr<LargeObj>(&obj));
}
for (auto ite = store_by_pointer.begin(); ite != store_by_pointer.end(); ite++)
{
printf("ID: %d\n", (*ite)->id);
}
return 0;
}
私の質問は、なぜ各push_back
は、前回と同じが押されているすべてのオブジェクトを作るので、その前にすべてのアイテムを交換しないで
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
[00000000001A6180] is constructed
[00000000001A6180] is destroyed
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
次のように出力されていますmake_unique
を使用するか、さらに良い - この場合にはLargeObj
はあなたがnew
によって返されたポインタではなく、スタック変数のアドレスからunique_ptr
を構築すべきであるID 9.
私は本当にあなたの詳細な回答と私の文法の訂正を認めます。 –