Рассмотрим следующие коды
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
Затем я сравниваю реализацию 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;
}
НКУ
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)...);
}
Кажется, странный _Reserve(1);
используется в VS2013
. Почему?
Edit:
Значение hex
-17891602
равно 0xFEEEFEEE
, что означает
Используется Microsoft debug HeapFree() для отметки освобожденной памяти кучи
обратитесь к магическому номеру
Затем я отлаживал приведенные выше строки по строкам и обнаружил вызванный 0xFEEEFEEE
вызванный _Reserve(1);
.