微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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算法安全使用,这可能是您的一个问题.

原文地址:https://www.jb51.cc/c/115839.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐