所以这就是我遇到的问题。
我有一个指向std :: vector的指针。因此,在初始化指针后,我不会向向量添加任何项目,也不会删除任何项目。但是,在我的代码中的某个点,我的std :: vector移动位置,我最终得到一个悬空指针。这似乎是随机发生的,即使我在制作指针
之后从未触摸过矢量我花了一段时间调试这个问题,以解决这个问题。有没有办法保证我的std :: vector不会改变内存位置?或者指向一个向量是一个坏主意。
答案 0 :(得分:1)
或者指向一个向量是一个坏主意吗?
一般来说,我会说拥有用于控制对象生命周期的原始指针是一个坏主意。不要使用原始指针和自动内存管理,尝试使用具有适当所有权语义的智能指针(std::shared_ptr<>
或std::unique_ptr<>
)。仅使用原始指针来观察指针(如果您希望能够在运行时验证它们是否悬空,请使用weak_ptr<>
)。
此外,在许多情况下,您可能会发现根本不需要指针。在这种情况下,只需使用具有自动存储的对象,由于移动语义,可以在C ++ 11中有效地移动或传递/返回值。
答案 1 :(得分:1)
这似乎是随机发生的
不,它没有。只要它保持在范围内,它就具有相同的地址。可能发生的事情是向量超出范围,并且由于它是自动分配的(听起来像),它在那时被摧毁。你可以做的是在堆上分配向量(例如int
s):
std::vector<int>* pv = new std::vector<int>();
然后你不会有这个问题。但是,您必须记住使用
明确delete
delete vp;
在pv
超出范围之前,或者你会发生内存泄漏。