Недавно я узнал об использовании 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;
}
Выход следующего
[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
Мой вопрос почему каждый push_back
заменить все элементы перед ним и, таким образом, сделать все объекты так же, как последнее толкание, который в этом случае является LargeObj
с идентификатором 9.
Я действительно ценю ваш подробный ответ и исправление моей грамматики. –