【问题标题】:Pointer pointing to an element in a vector gets set to NULL when the structure grows当结构增长时,指向向量中元素的指针被设置为 NULL
【发布时间】:2015-03-25 12:08:19
【问题描述】:

指向对象的指针被设置为 NULL,尽管函数中的任何地方都没有 pointerToObj = NULL。后来我将该指针用于某些东西,它会导致访问冲突异常。我还添加了一个测试指针以查看它是否会保留其值,但不会 - 两者同时设置为 NULL。

指针指向向量中的一个对象。有一次,我向向量添加了一个新对象,因此结构增长了。在此之后,指针被设置为 NULL。我对此进行了测试 - 所有指向向量特定元素的指针,在我添加新对象后立即设置为 NULL。

我怀疑这是因为向量的工作方式造成的——如果我没记错的话,它们是基于堆栈的。当堆栈必须自己加长时,它必须将自己复制到一个更大的新数组中并删除旧数组。但是现在新数组位于内存中的其他位置,所以我的指针不再指向正确的位置。

真的是这样吗?

【问题讨论】:

  • std::vector 不像您描述的那样工作,即外部指针设置为 NULL。您需要发布此行为的代码。
  • 您是否验证过指针实际上设置为NULL? 如何?(最小代码示例?)虽然取消引用空指针会导致访问冲突(在 Windows 上),但反之则不然。所有无效指针都会发生访问冲突,而不仅仅是空指针。

标签: c++ arrays pointers vector


【解决方案1】:

是的,由于您描述的原因,将元素添加到 std::vector 可能会使指向其元素的指针无效(但它与堆栈没有任何关系)。您的指针并没有被神奇地设置为 null,它只是指向一个不存在的对象。

【讨论】:

  • 补充:解决方案是您不应该将指向对象的指针存储在vector 中。相反,存储对象的索引,或使用保存指针的容器。
  • 是的,我将 NULL 指针与无效指针混淆了。我猜我对向量的工作原理有误解。
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2013-02-23
  • 2011-03-12
  • 2015-09-11
相关资源
最近更新 更多