Ich habe kürzlich über die Verwendung von unique_ptr
in der Hoffnung gelernt, dass ich den Kopieraufwand loswerden kann, der von der Store-by-Value-Eigenschaft von STL-Containern herrührt. Jedoch bin ich auf ein wirklich seltsames Verhalten gestoßen und konnte nicht herausfinden warum.Unerwartetes Überschreiben von "unique_ptr" in Vektor
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;
}
Die Ausgabe ist wie folgt
[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
Meine Frage ist, warum jeder push_back
alle Elemente vor ersetzen und damit alle Objekte machen das gleiche wie das letzte geschoben wird, die in diesem Fall ist die LargeObj
mit ID 9.
Ich schätze Ihre ausführliche Antwort und die Korrektur meiner Grammatik wirklich. –