使用pop_back时防止指针失效

时间:2016-10-12 03:29:47

标签: c++ pointers

如果指针指向矢量的最后一个元素,并且我想删除元素但是通过指针保存数据,我该怎么办?

vector<int> a;
a.push_back(1);
int * b = a[0];
a.pop_back();     //b is invalidated

我被迫使用不同的容器还是有其他方式?

2 个答案:

答案 0 :(得分:2)

从问题看来,您似乎特别希望将指针保留为从容器中删除的元素。所有容器使指针和对已擦除对象的引用无效。如果您需要从容器中擦除对象但保持指向对象的活动,唯一可行的标准库容器是std::list<T>:您可以splice()将对象放入不同的列表中:

std::list<int> a;
std::list<int> removed;

a.push_back(1);
int* b = &a.front();
a.splice(a.begin(), removed);

在此操作之后,b指向的对象不在a中,而是在removed中。

答案 1 :(得分:2)

向量保留数据的内部副本,因此您通常不能依赖指向内部数据的指针(push_back或pop_back可能会使它们无效)。您可以在代码中复制int b = a[0];,或在向量中存储指针而不是值。请注意,在后一种情况下,您需要小心内存管理,例如使用vector<unique_ptr<T>>