C ++指向一个对象,然后移动它的内存位置

时间:2016-12-13 16:43:02

标签: c++ pointers shared-ptr dynamic-memory-allocation

我正在使用C ++ 14。我们假设我有class Xstd::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时我都应该更新许多属性。是否可以管理它并仍在使用指针?

1 个答案:

答案 0 :(得分:9)

首先要做的事情。 Everything works fine。没有。没有什么工作正常。您不应该将共享指针(或任何其他智能指针)返回到您自己未分配的内存中。

Vector会管理自己的成员,如果您尝试管理vector元素,那么您就会遇到大麻烦。

现在回答你的问题。看起来vector不适合您的目标。如果你使用普通指针(而不是智能指针),你可以使用,例如std::deque - 只要你不插入队列的中间,只使用push_back和{{ 1}}。

另一种选择是使用索引而不是指针并保持push_front - 即使在插入后索引也将保持不变。