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

San*_*Gil 0 c++ pointers shared-ptr dynamic-memory-allocation

我正在使用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])
}
Run Code Online (Sandbox Code Playgroud)

此方法将对象x插入mVector并返回一个指向此插入对象的共享指针.

X x1;
shared_ptr<X> pX1 = AddX(x1);
Run Code Online (Sandbox Code Playgroud)

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

X x2;
shared_ptr<X> pX2 = AddX(x2);
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能解决这个问题?我想比一种方法可以使用对象索引而不是它们的指针,但这会惩罚我的执行时间,因为我应该每次修改时更新许多属性mVector.是否可以管理它并仍然使用指针?

Ser*_*eyA 9

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

Vector管理自己的成员,如果你试图管理vector元素,你就会遇到大麻烦.

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

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