当结构增长时,指向矢量中元素的指针将设置为 NULL

Pointer pointing to an element in a vector gets set to NULL when the structure grows

本文关键字:元素 指针 NULL 设置 结构      更新时间:2023-10-16
指向

对象的指针设置为 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()元素时,矢量大小都会加倍,第一个元素指针将指向适合加倍大小的新位置。您可以将第一个元素设置为客户端类型的垃圾或空对象,也可以在对它执行任何操作之前保留向量内存,以便保持所有地址不变。你可以在这里看到这是如何完成的:向量的第一个指针的变化。