首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >VS2013下的emplace_back()问题

VS2013下的emplace_back()问题
EN

Stack Overflow用户
提问于 2016-01-04 14:09:37
回答 1查看 947关注 0票数 16

考虑以下代码

std::vector<int> nums{21, 22, 23, 24};
nums.emplace_back(nums[0]);
nums.emplace_back(nums[1]);

for (auto n : nums) {
    std::cout << n << std::endl;
}

VS2013的输出

21
22
23
24
-17891602
22

为什么 -17891602 在这里?

GCC 4.8.4的输出正确,如下所示

21
22
23
24
21
22

然后对VS2013GCCemplace_back实现进行了比较

VS2013

template<class... _Valty>
    void emplace_back(_Valty&&... _Val)
    {   // insert by moving into element at end
    if (this->_Mylast == this->_Myend)
        _Reserve(1);
    _Orphan_range(this->_Mylast, this->_Mylast);
    this->_Getal().construct(this->_Mylast,
        _STD forward<_Valty>(_Val)...);
    ++this->_Mylast;
    }

GCC

template<typename _Tp, typename _Alloc>
template<typename... _Args>
  void
  vector<_Tp, _Alloc>::
  emplace_back(_Args&&... __args)
  {
    if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
      {
        _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                                 std::forward<_Args>(__args)...);
        ++this->_M_impl._M_finish;
      }
    else
      _M_emplace_back_aux(std::forward<_Args>(__args)...);
  }

似乎在VS2013中使用了奇怪的_Reserve(1);。为什么?

编辑:

-17891602hex值为0xFEEEFEEE,表示

由微软的调试HeapFree()使用的

,用于标记已释放的堆内存

请参阅magic number

然后逐行调试上述代码,发现调用_Reserve(1);导致的0XFEEEFEEE

EN

回答 1

Stack Overflow用户

发布于 2016-01-04 14:22:14

在VS2013和VS2015中,当将元素嵌入到包含该元素的向量中时,这是一个问题。如果向量调整大小,则对所插入元素的引用无效。解决方法是在insert中创建该元素的副本,然后插入该副本。

auto n = nums[0];
nums.emplace_back(n);

_Reserve调用是为了确保为向量分配了一些内存(这样就不必在以后的操作中检查它)。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34585575

复制
相关文章

相似问题

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