用new创建一个向量是否安全?

3

当向量变满时,它会被重新分配,并且所有迭代器和指向元素的指针都将失效。如果使用new创建向量,这种行为是否会发生变化?

std::vector<int>* v = new std::vector<int>(); //What happens if this vector gets reallocated?

我能否通过指针获取对象(作为另一个变量),还是必须将其复制到另一个对象中?


4
向量的底层数组被重新分配,向量对象本身不会移动。更好的问题是,为什么要新建一个向量? - Borgleader
@Borgleader 因为它是可行的,所以我正在学习它。 - Xriuk
@Borgleader 等等,为什么不用 new 来创建一个向量呢?我猜如果你已经在使用向量,你可能只是想创建一个向量的向量。这是你的意思吗? - Patrick87
3
对象的语义通常不取决于对象存储的位置和方式。 - Kerrek SB
1
除了笨拙的语法、不必要的性能损失、生命周期管理问题和异常安全问题之外,动态分配的向量没有任何变化。 - nwp
显示剩余2条评论
4个回答

4
只要v没有被销毁,std::vector类模板包装的底层数组就处于良好状态,无论是否重新分配内存。

所以,基本上,在重新分配时,无效化只影响元素和迭代器的指针?而不是向量的指针? - Xriuk
1
@RomanHudylko 当然。你是否曾经因为std::vector重新分配其内部存储而“丢失”了一个非动态对象? - Angew is no longer proud of SO

3
回答标题问题:是的,动态分配 std::vector 对象是安全的(虽然不寻常)。
回答正文问题: std::vector 对象本身的分配方式不会影响其迭代器的有效性等。它们仍然会因为 std::vector 的内部数据存储的重新分配而失效。
对于最后一个问题,我不太理解。 *v 将给您一个动态分配的向量的引用。它没有复制任何东西。例如,(*v)[3] 将给您向量中索引为 3int

我在询问是否可以从指针获取对象,就像我从对象获取指针一样。但我想我只需将解引用的指针复制到新对象中,对吗? - Xriuk
1
解除指针引用会给你一个对象的引用。你可以直接访问它,或者将其复制到其他地方。 - Angew is no longer proud of SO
1
@Angew:明确一点,解引用指针并不会给你一个对象的引用,如果你所说的“引用”是指C++中的引用,例如T&。但从英语单词的一般意义上来说,没错。 :)出于这个原因,我更喜欢使用“别名”或“句柄”。 - Lightness Races in Orbit
@LightnessRacesinOrbit 我知道它并不完全是这样,但它非常接近。我认为“它给你一个对象的lvalue访问”对于这个问题的水平来说不太合适。 - Angew is no longer proud of SO

2
无论您是在堆栈上还是堆上创建向量,都没有关系。实际上,向量拥有存储空间,这可能只是它分配和重新分配的数组。您拥有的指针是指向所有者的,它不会改变。唯一与使用“new”不同的是,您需要释放所有者(可能是所有者释放所有内存)。

0

使用new是安全的,但并不能解决您在动态重新分配方面遇到的问题。向量对象承诺存储空间的连续性,因此您无法做太多事情。在某些操作之后,您可能不再依赖迭代器。为了防止在未知时间进行动态重新分配,请明确使用reserve()或resize()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接