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

C++ Point to an object and then move its memory position

我正在使用 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 并且 returns 我是指向此插入对象的共享指针。

X x1;
shared_ptr<X> pX1 = AddX(x1);

一切正常,但是当我插入第二个对象时

X x2;
shared_ptr<X> pX2 = AddX(x2);

pX1 没有指向插入的对象 x1,因为最后一个 push_back 已经移动了它在内存中的位置(经过硬调试后看到)。这对我来说是一个遗憾,因为我的程序需要这些指针才能正常工作,并且 mVector 需要是动态的,它一直在修改(有新的 X 对象,或者旧的被删除) .

我该如何解决这个问题?我想有一种方法可以使用对象索引而不是它们的指针,但这会影响我的执行时间,因为每次修改 mVector 时我都应该更新许多属性。是否可以管理它并继续使用指针?

要事第一。 Everything works fine。不,没有任何效果。你不应该 return 共享指针(或任何其他智能指针)到你没有分配给自己的内存。

Vector 管理它自己的成员,如果你试图管理 vector 个元素,你就有大麻烦了。

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

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