当一个向量变满时,它会被重新分配,并且所有迭代器和指向元素的指针都将无效。当使用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()。