Я не очень привык к использованию weak_ptr
и столкнулся с довольно запутанной ситуацией. Я использую Intel XE 2019 Composer update 5 ( пакет 2019.5.281 ) в сочетании с Visual Studio 2019 ver. 16.2.5 . Я компилирую в 64-битной версии. Я использую стандарт C ++ 17 .
Вот код для моего решения спайка:
#include <memory>
#include <iostream>
using namespace std;
int main( int argc, char* argv[] )
{
shared_ptr<int> sp = make_shared<int>( 42 );
cout << "*sp = " << *sp << endl;
weak_ptr<int> wp = sp;
cout << "*sp = " << *sp << ", *wp = " << *wp.lock() << endl;
wp.reset();
cout << "*sp = " << *sp << endl;
return 0;
}
Результат, который я ожидал получить:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
... но вот что я получил:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
Что происходит? Это нормально для того, shared_ptr
чтобы быть измененным / недействительным, когда / связанный weak_ptr
сброшен? Я немного смущен результатами, которые я получил. Честно говоря, я не ожидал этого результата ...
РЕДАКТИРОВАТЬ 1
В то время как ошибка возникает в 64-битной конфигурации, она не в 32-битной . В этой более поздней конфигурации результат является ожидаемым.
РЕДАКТИРОВАТЬ 2
Ошибка возникает только в Debug . Когда я встраиваю Release , я получаю ожидаемый результат.
источник
-572662307 = 0xDDDDDDDD
которая является способом msvc указывать освобожденную память кучиОтветы:
Похоже, что это реальная ошибка на стороне Intel ICC; Я сообщил об этом.
Еще раз спасибо за помощь в определении этой проблемы.
источник
Похоже на ошибку в библиотеке отладки, со значениями Sentinel. Это легко проверить, используя строку, которую я упомянул:
Если
2 2
вместо вывода выводится1 2
, то компилятор не соответствует и, возможно, все еще рассматривает такой случай как UB. В этом случае значения Sentinel могут быть ошибочно использованы при вызовеreset()
. То же самое происходит с удалением объекта, созданного путем помещения нового в предварительно выделенный статический буфер, в режиме отладки он перезаписывается некоторыми реализациями со значениями часового типа.источник
1 2
в обоих 64-битной и 32-битной , Debug и Release ._Ref_count_base
cTor по умолчанию, который указан= default
. Два члена_Uses = 1
и_Weaks = 1
установлены1
и0
соответственно. Кажется, что сгенерированный по умолчанию cTor прослушивается. Смотретьmemory
файл ...