【发布时间】:2016-04-07 17:40:40
【问题描述】:
考虑以下代码
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
然后我比较VS2013和GCC之间emplace_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;
}
海合会
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);。为什么?
编辑:
-17891602 的hex 值为0xFEEEFEEE,这意味着
被微软的 debug HeapFree() 用来标记释放的堆内存
然后我逐行调试上面的代码,发现调用了_Reserve(1);引起的0XFEEEFEEE。
【问题讨论】:
-
这个问题我想知道为什么
_Reserve(1)用在VS2013里?与上面的链接不同。
标签: c++ c++11 gcc visual-studio-2013