【问题标题】:C++ std::vector<T*> if you hold a pointer to a pointer element, does it become invalidated upon resize?C++ std::vector<T*> 如果你持有一个指向指针元素的指针,它会在调整大小时失效吗?
【发布时间】:2020-03-02 11:22:18
【问题描述】:

假设我创建 std::vector&lt;int*&gt; myVec; 并保留 100 个条目并用值填充向量,以便所有 100 个元素都有有效的指针。然后我缓存一个指向其中一个元素的指针,

int * x = myVec[60];

然后,如果我附加另一个int *,它会触发调整大小以及由于堆碎片而导致的移动,那么指向指针的前一个指针会失效还是指向内存中的新位置?

如果我的记忆服务器是正确的,如果示例是 std::vector&lt;int&gt; myVecTwo,条件与上述相同,并且我存储了一个类似

的 ptr
int * x = &myVecTwo[60]; 

并继续追加和调整大小,该指针将无效。

所以,我的问题如下。指向指针的指针会失效吗?由于 is_trivially_copyable 的新 C++ std 功能以及 std::vector 是否使用此类功能或 POD 检查,我不再确定。

指针会在 C++11 中失效吗?

【问题讨论】:

  • 这很简单。如果你有一个迭代器,或者一个指向向量元素的引用/指针,那么在调整大小后它将失效(你必须假设它不再有效)。在您的第一个示例中,情况并非如此。您只是复制已经存储在向量中的指针——您没有存储指向该值的实际向量存储的指针。没关系:x 在调整大小后将是同一个指针。在您的第二个示例中,是的,绝对是 x 在调整大小后可能无效。关于指针对指针,我在您的问题中没有看到任何这些。
  • 您的术语很奇怪,您的示例中没有“指向指针的指针”,您的第一个示例只是复制指针
  • 我要问的是,如果我将一个指针复制到向量中的一个元素,并且由于调整大小,每个指针都被删除并调用了 new,我最初复制的那个指针是否指向内存中的相同值。对困惑感到抱歉。你确定它没有失效吗?
  • @kmdreko int * x 指向向量中索引 60 处的指针元素。如果它按照您的建议复制指针,并且该指针通过调整大小进行更改,不是吗然后指向别的东西?这就是我要问的
  • 不,不是,那是int**int * x 指向myVec[60] 指向的内容,分配后与myVec 没有任何关联

标签: c++ c++11 pointers vector data-structures


【解决方案1】:

没有。

正如您所展示的,在重新分配之后,指向vector 元素的指针(如int * x = &amp;myVecTwo[60];)将失效。重新分配后,元素本身会被复制,但元素指针指向的对象不受影响,那么对于int * x = myVec[60];,重新分配后x仍然指向同一个对象,与此无关随着vector的重新分配。

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2021-02-17
    相关资源
    最近更新 更多