考虑以下代码
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;
}
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);
。为什么?
编辑:
-17891602
的hex
值为0xFEEEFEEE
,表示
由微软的调试HeapFree()使用的
,用于标记已释放的堆内存
请参阅magic number
然后逐行调试上述代码,发现调用_Reserve(1);
导致的0XFEEEFEEE
。
发布于 2016-01-04 14:22:14
在VS2013和VS2015中,当将元素嵌入到包含该元素的向量中时,这是一个问题。如果向量调整大小,则对所插入元素的引用无效。解决方法是在insert中创建该元素的副本,然后插入该副本。
auto n = nums[0];
nums.emplace_back(n);
_Reserve调用是为了确保为向量分配了一些内存(这样就不必在以后的操作中检查它)。
https://stackoverflow.com/questions/34585575
复制相似问题