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