用new创建向量安全吗
Is it safe to create a vector with new?
当一个向量变满时,它会被重新分配,并且所有迭代器和指向元素的指针都将无效。当使用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()。
相关文章:
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- 在移出向量上调用 size() 方法是否安全?
- 我可以在中断中写入向量,然后以安全的方式仅在主线程内读取吗?
- 是一个std ::向量线程,我的目的是安全的
- C++向量的分配 双 = 安全?
- 制作安全的读取器/写入器向量
- 将线程的结果转储到向量中是线程安全的吗
- C++以内存安全的方式使用给定向量的大小创建2D阵列
- 当需要数组时,将指针传递到向量中的第一个元素是否安全
- 将memcpy与Eigen类型的向量一起使用安全吗
- 在C++中动态分配向量的安全方法是什么
- 向量::插入的异常安全保证是什么?
- C++ STL 向量迭代器与索引访问和线程安全
- 如何在 C++11 中的函数内初始化线程安全静态常量向量
- 从同一向量push_back元素是否安全
- 将两个 std::vector<cv::P oint> 向量和安全公共点与第三个 std::vector<cv::P oint 进行比较>
- 用new创建向量安全吗
- C++线程安全向量.erase
- 线程安全向量