当结构增长时,指向矢量中元素的指针将设置为 NULL
Pointer pointing to an element in a vector gets set to NULL when the structure grows
对象的指针设置为 NULL,尽管函数中的任何位置都没有pointerToObj = NULL
。后来我使用该指针进行某些操作,它会导致访问冲突异常。我还添加了一个测试指针以查看它是否会保留其值,但没有 - 两者都同时设置为 NULL。
指针指向矢量中的对象。有一次,我向向量添加了一个新对象,因此结构会增长。在此之后,指针将立即设置为 NULL。我对此进行了测试-所有指向矢量某个元素的指针在添加新对象后立即设置为NULL。
我怀疑发生这种情况是因为向量的工作方式 - 如果我没记错的话,它们基于堆栈。当堆栈必须加长自身时,它必须在新的更大数组中复制自身并删除旧数组。但是现在新数组位于内存中的其他位置,因此我的指针不再指向正确的位置。
真的是这样吗?
是的,将元素添加到std::vector
可能会由于您描述的原因而使指向其元素的指针无效(但它与堆栈没有任何关系)。不过,您的指针并没有神奇地设置为 null,它只是指向一个不存在的对象。
使用 std::vector 存储具有指针成员的指针或对象会重置指向新矢量分配的内存地址 - NULL 或任何内存地址的所有指针。在向量中将其推回后,可以将指针设置为所需的值,而不是在 push_back() 之前设置它。例如,如果你有一个名为 x 的类客户端对象,它有指针,并且你想把它存储在向量 v 中。这样做:
client x;
v.push_back(x);
static int i = 0;
v[i++].set_name();
因此,如果您调用 v[i].get_name(),指针将指向名称。
而不是:
client x;
x.set_name();
v.push_back(x);
x.get_name();
这将返回一个随机内存地址。
请注意,每次push_back()元素时,矢量大小都会加倍,第一个元素指针将指向适合加倍大小的新位置。您可以将第一个元素设置为客户端类型的垃圾或空对象,也可以在对它执行任何操作之前保留向量内存,以便保持所有地址不变。你可以在这里看到这是如何完成的:向量的第一个指针的变化。
- 调整大小后指向元素值的指针unordered_map有效?
- 当该数组的索引中没有元素时,指针指向什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 删除指针数组 (C++) 中的元素
- 从指向结构数组的指针中提取元素
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 获取指向指针的指针元素 (c++)
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 存储指向动态数组元素的指针
- 通过作为指向 C++ 函数的指针传递来访问 std::array 元素的正确方法是什么?
- 如何使用指针C++将元素从2D数组复制到1D数组
- 如何将元素插入到标准::地图的共享指针中?
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在删除之前更新一组元素指针中的元素
- 从 BST 中删除元素(指针错误)
- 避免强制转换容器的元素指针类型
- 填充一个无序的vector元素指针队列
- OpenCV元素指针如何存在于Obj-C类中