Non sono molto abituato ad usare weak_ptr
e sto affrontando una situazione piuttosto confusa. Sto usando Intel XE 2019 Composer update 5 ( pacchetto 2019.5.281 ) in combinazione con Visual Studio 2019 ver. 16.2.5 . Compilo in 64 bit. Uso lo standard C ++ 17 .
Ecco il codice per la mia soluzione spike:
#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;
}
L'output che mi aspettavo di avere è:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
... ma ecco cosa ho ottenuto:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
Cosa sta succedendo? È normale shared_ptr
che venga modificato / invalidato quando weak_ptr
viene ripristinato / an associato ? Sono un po 'confuso riguardo ai risultati che ho ottenuto. A dire il vero non mi aspettavo questo risultato ...
MODIFICA 1
Mentre il bug si verifica nella configurazione a 64 bit , non nel 32 bit . In questa configurazione successiva, il risultato è quello che ci si aspetta.
MODIFICA 2
Il bug si verifica solo in Debug . Quando compilo in Release , ottengo il risultato atteso.
-572662307 = 0xDDDDDDDD
che è il modo di msvc per indicare la memoria heap liberata