zan*_*ngw 16 c++ gcc c++11 visual-studio-2013
请考虑以下代码
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;
}
Run Code Online (Sandbox Code Playgroud)
输出 VS2013
21
22
23
24
-17891602
22
Run Code Online (Sandbox Code Playgroud)
为什么会在-17891602这里?
输出GCC 4.8.4正确如下
21
22
23
24
21
22
Run Code Online (Sandbox Code Playgroud)
然后我比较的执行emplace_back之间VS2013和GCC
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;
}
Run Code Online (Sandbox Code Playgroud)
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)...);
}
Run Code Online (Sandbox Code Playgroud)
似乎奇怪的_Reserve(1);是用于VS2013.为什么?
编辑:
所述hex的值-17891602是0xFEEEFEEE,这意味着
由Microsoft的调试HeapFree()用于标记释放的堆内存
参考幻数
然后我逐行调试上面的代码,发现调用0XFEEEFEEE引起的_Reserve(1);.
120*_*arm 12
当将元素放入包含该元素的向量时,这是VS2013和VS2015中的问题.如果向量调整大小,则对要插入的元素的引用无效.解决方法是在insert中创建元素的副本,然后插入该元素.
auto n = nums[0];
nums.emplace_back(n);
Run Code Online (Sandbox Code Playgroud)
_Reserve调用用于确保为向量分配了一些内存(因此在以后的操作中不必检查它).
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |