c++ - std::vector 是否更改其地址?如何避免

标签 c++ stl vector

由于 vector 元素是连续存储的,我猜它在一些 push_back 之后可能没有相同的地址,因为初始分配的空间不够用。

我正在编写一段代码,我需要在其中引用 vector 中的元素,例如:

int main(){
    vector<int> v;
    v.push_back(1);
    int *ptr = &v[0];
    for(int i=2; i<100; i++)
        v.push_back(i);
    cout << *ptr << endl; //?
    return 0;
}

但是 ptr 不一定包含对 v[0] 的引用,对吗?怎样保证比较好?

我的第一个想法是使用指针 vector 和动态分配。我想知道是否有更简单的方法来做到这一点?

PS.: 实际上我使用的是一个类的 vector 而不是 int,但我认为问题是一样的。

最佳答案

不要使用 reserve 来推迟这个悬空指针错误 - 因为遇到同样问题的人耸耸肩,保留 1000,然后几个月后花了很长时间试图找出一些奇怪的内存错误( vector 容量超过 1000),我可以告诉你这不是一个可靠的解决方案。

您希望尽可能避免获取 vector 中元素的地址,正是因为重新分配的不可预测性。如果必须,请使用迭代器而不是原始地址,因为经过检查的 STL 实现会在它们变得无效时告诉您,而不是随机崩溃。

最好的解决办法是改变你的容器:

  • 您可以使用 std::list - 它不会在添加元素时使现有迭代器失效,并且只有已删除元素的迭代器在删除时才会失效
  • 如果您使用的是 C++0x,std::vector> 是一个有趣的解决方案
  • 或者,使用指针和新建/删除也不错 - 只是不要忘记在删除指针之前删除它们。这样做并不难,但是您必须非常小心,不要因忘记删除而导致内存泄漏。 (Mark Ransom 还指出:这不是异常安全的,如果异常导致 vector 被破坏,则整个 vector 内容都会泄露。)
  • 请注意,boost 的 ptr_vector 不能安全地与某些 STL 算法一起使用,这对您来说可能是个问题。

关于c++ - std::vector 是否更改其地址?如何避免,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2447392/

相关文章:

c++ - 根据运行时参数调用不同版本的模板函数

c++ - 函数中的参数数量未知

c++ - 使用 find_if 查找结构内部的 int for std::list with structs

c++ - 具有相同存储类型的 vector 之间的函数不匹配

android - 我在哪里可以找到 Android 营销图片?一个空白的平板电脑图像,我可以将我正在运行的应用程序粘贴到其中作为宣传图片,这将是完美的

c++ - 从函数返回数组并丢失其大小

c++ - 将 CVD 图像转换为彩色 OpenCV 图像

c++ - Boost.享元内存消耗

c++ - C++ STL 函数 find() 不接受用户定义类的迭代器参数

c++ - 在两个类实例之间共享 vector