由于向量元素是连续存储的,所以我猜这可能在一些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算法安全使用,这可能是您的一个问题.