Я не дуже звик користуватися 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-бітовій . У цій більш пізній конфігурації результат - це те, що очікується.
EDIT 2
Помилка трапляється лише в Налагодження . Коли я будую Release , я отримую очікуваний результат.
-572662307 = 0xDDDDDDDD
що є способом msvc вказувати звільнену пам’ять купи