我正在使用C ++ 14。我们假设我有class X
和std::vector<X> mVector
。
我还有以下代码:
std::shared_ptr<X> AddX(const X &x)
{
mVector.push_back[x];
return std::shared_ptr<X>(&mVector[mVector.size()-1])
}
此方法将对象x
插入mVector
并返回指向此插入对象的共享指针。
X x1;
shared_ptr<X> pX1 = AddX(x1);
一切正常,但是当我插入第二个对象时
X x2;
shared_ptr<X> pX2 = AddX(x2);
pX1
未指向插入的对象x1
,因为最后一个push_back已将其位置移动到内存中(在硬调试后看到)。这对我来说很遗憾,因为我的程序需要这些指针才能正常工作,而mVector
需要是动态的,它一直在被修改(使用新的X
个对象,或删除旧对象)
我该如何解决这个问题?我想一种方法可能是使用对象索引而不是它们的指针,但这会惩罚我的执行时间,因为每次修改mVector
时我都应该更新许多属性。是否可以管理它并仍在使用指针?
答案 0 :(得分:9)
首先要做的事情。 Everything works fine
。没有。没有什么工作正常。您不应该将共享指针(或任何其他智能指针)返回到您自己未分配的内存中。
Vector会管理自己的成员,如果您尝试管理vector
元素,那么您就会遇到大麻烦。
现在回答你的问题。看起来vector
不适合您的目标。如果你使用普通指针(而不是智能指针),你可以使用,例如std::deque
- 只要你不插入队列的中间,只使用push_back
和{{ 1}}。
另一种选择是使用索引而不是指针并保持push_front
- 即使在插入后索引也将保持不变。