使用new创建向量是否安全?

时间:2015-11-13 14:01:47

标签: c++

当向量变满时,它将被重新分配,并且所有迭代器和指向元素的指针都将失效。使用new创建向量时,此行为是否会以任何方式更改?

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

我可以从指针中获取对象(作为单独的变量),还是必须将其复制到另一个对象?

4 个答案:

答案 0 :(得分:4)

只要v未被销毁,底层数组(由std::vector类模板包装)就处于良好状态,无论是否重新分配。

答案 1 :(得分:3)

回答标题问题:是的,动态分配std::vector对象是安全的(如果不寻常)。

回答身体问题:

如何分配std::vector对象本身并不会影响其迭代器等的有效性。它们仍然通过重新分配std::vector的内部数据存储而失效。

对于最后一个问题,我不太明白。 *v将为您提供动态分配的向量。它不会复制任何东西。例如,(*v)[3]会在向量中为您提供int索引3

答案 2 :(得分:2)

无论是在堆栈上还是在堆上创建向量都无关紧要。向量实际上拥有存储空间,它可能只是一个分配和重新分配的数组。你拥有的指针是没有改变的所有者。与new的唯一区别在于您负责释放所有者(可能是所有者释放拥有的内存)。

答案 3 :(得分:0)

使用new是安全的,但对于动态重新分配的问题并没有帮助。矢量对象承诺存储空间的连续性,因此您无能为力。在某些操作之后,您可能不再依赖于迭代器了。要防止在未知时间动态重新分配,请使用reserve()或resize()显式。