首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从相同的向量push_back一个元素是安全的吗?

从相同的向量push_back一个元素是安全的吗?
EN

Stack Overflow用户
提问于 2013-09-13 22:27:30
回答 3查看 7.3K关注 0票数 131
代码语言:javascript
复制
vector<int> v;
v.push_back(1);
v.push_back(v[0]);

如果第二个push_back导致重新分配,则对向量中第一个整数的引用将不再有效。所以这不安全?

代码语言:javascript
复制
vector<int> v;
v.push_back(1);
v.reserve(v.size() + 1);
v.push_back(v[0]);

这让它很安全吗?

EN

回答 3

Stack Overflow用户

发布于 2013-09-13 22:28:45

是的,它是安全的,标准库实现也是如此。

我相信实现者将这个需求追溯到23.2/11,但我不知道是怎么回事,我也找不到更具体的东西。我能找到的最好的是这篇文章:

http://www.drdobbs.com/cpp/copying-container-elements-from-the-c-li/240155771

对libc++和libstdc++实现的检查表明,它们也是安全的。

票数 22
EN

Stack Overflow用户

发布于 2013-09-13 22:51:58

第一个示例是否安全并不明显,因为push_back最简单的实现是,如果需要,首先重新分配向量,然后复制引用。

但至少在Visual Studio2010中看起来是安全的。它的push_back实现在您推回向量中的元素时会对这种情况进行特殊处理。代码的结构如下:

代码语言:javascript
复制
void push_back(const _Ty& _Val)
    {   // insert element at end
    if (_Inside(_STD addressof(_Val)))
        {   // push back an element
                    ...
        }
    else
        {   // push back a non-element
                    ...
        }
    }
票数 7
EN

Stack Overflow用户

发布于 2013-09-14 01:10:56

这不是标准的保证,但是作为另一个数据点,v.push_back(v[0])对于LLVM's libc++是安全的。

libc++'s std::vector::push_back需要重新分配内存时,它调用__push_back_slow_path

代码语言:javascript
复制
void __push_back_slow_path(_Up& __x) {
  allocator_type& __a = this->__alloc();
  __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), 
                                                  size(), 
                                                  __a);
  // Note that we construct a copy of __x before deallocating
  // the existing storage or moving existing elements.
  __alloc_traits::construct(__a, 
                            _VSTD::__to_raw_pointer(__v.__end_), 
                            _VSTD::forward<_Up>(__x));
  __v.__end_++;
  // Moving existing elements happens here:
  __swap_out_circular_buffer(__v);
  // When __v goes out of scope, __x will be invalid.
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18788780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档