请考虑以下代码
std::vectornums{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
然后我比较的执行emplace_back
之间VS2013
和GCC
VS2013
templatevoid 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
templatetemplate 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)...); }
似乎奇怪的_Reserve(1);
是用于VS2013
.为什么?
编辑:
所述hex
的值-17891602
是0xFEEEFEEE
,这意味着
由Microsoft的调试HeapFree()用于标记释放的堆内存
参考幻数
然后我逐行调试上面的代码,发现调用0XFEEEFEEE
引起的_Reserve(1);
.
当将元素放入包含该元素的向量时,这是VS2013和VS2015中的问题.如果向量调整大小,则对要插入的元素的引用无效.解决方法是在insert中创建元素的副本,然后插入该元素.
auto n = nums[0]; nums.emplace_back(n);
_Reserve调用用于确保为向量分配了一些内存(因此在以后的操作中不必检查它).