用new创建向量安全吗

Is it safe to create a vector with new?

本文关键字:安全 向量 创建 new      更新时间:2023-10-16

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

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

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

只要v没有被破坏,底层数组(由std::vector类模板包裹在内部)就处于良好状态,而不考虑任何重新分配。

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

回答身体问题:

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

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

不管是在堆栈上还是在堆上创建向量。向量实际上拥有存储空间,存储空间可能只是它分配和重新分配的一个阵列。你的指针指向的是不会改变的所有者。与new的唯一区别在于,您负责释放所有者(可能是所有者释放了所拥有的内存)。

使用new是安全的,但无助于解决动态重新分配的问题。vector对象承诺存储空间的连续性,所以你没有什么可做的。在某些操作之后,你可能不再依赖迭代器了。要防止在未知时间动态重新分配,请显式使用reserve()或resize()。