【发布时间】:2020-03-02 11:22:18
【问题描述】:
假设我创建 std::vector<int*> myVec; 并保留 100 个条目并用值填充向量,以便所有 100 个元素都有有效的指针。然后我缓存一个指向其中一个元素的指针,
int * x = myVec[60];
然后,如果我附加另一个int *,它会触发调整大小以及由于堆碎片而导致的移动,那么指向指针的前一个指针会失效还是指向内存中的新位置?
如果我的记忆服务器是正确的,如果示例是 std::vector<int> myVecTwo,条件与上述相同,并且我存储了一个类似
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