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

由于向量元素是连续存储的,所以我猜这可能在一些push_back之后可能没有相同的地址,因为初始分配的空间是不够的.

我正在编写一个代码,我需要一个引用元素的向量,如:

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]的引用不一定正确吗?怎样才能保证呢?

我的第一个想法是使用指针和动态分配的向量.我想知道是否有更简单的方法呢?

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

解决方法

不要使用储备来推迟这个悬挂的指针错误 – 作为一个有同样问题的人,耸耸肩,保留1000,然后几个月后花费时间试图找出一些奇怪的记忆错误(向量容量超过1000),我可以告诉你这不是一个强大的解决方案.

如果可能的话,您希望避免将元素的地址放在一个向量中,这正是因为重新分配的不可预测的性质.如果您必须使用迭代器而不是原始地址,那么由于已检查的STL实现会告诉您何时它们变得无效,而不是随机崩溃.

最好的解决方案是更换容器:

>您可以使用std :: list – 当添加元素时,它不会使现有的迭代器无效,并且只有擦除元素的迭代器在擦除时无效>如果你使用C 0x,std :: vector< std :: unique_ptr< T>>是一个有趣的解决方案>或者,使用指针和新/删除不是太糟糕 – 只是不要忘记删除指针,然后再擦除它们.这样做并不困难,但是您必须非常小心,不要忘记删除内存泄漏. (Mark Ransom也指出:这不是例外安全的,如果异常导致向量被破坏,整个向量内容都会被泄露.)>请注意,boost的ptr_vector不能与某些STL算法安全使用,这可能是您的一个问题.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...