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_back
和 push_front
。
另一种选择是使用索引而不是指针并保持 vector
- 即使在插入后索引也将保持不变。
我正在使用 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_back
和 push_front
。
另一种选择是使用索引而不是指针并保持 vector
- 即使在插入后索引也将保持不变。