No estoy muy acostumbrado a usar weak_ptr
y me enfrento a una situación bastante confusa. Estoy usando Intel XE 2019 Composer actualización 5 ( paquete 2019.5.281 ) en combinación con Visual Studio 2019 ver. 16.2.5 . Compilo en 64 bits. Yo uso el estándar C ++ 17 .
Aquí está el código para mi solución de pico:
#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;
}
El resultado que esperaba tener es:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
... pero esto es lo que obtuve:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
¿Que está pasando? ¿Es normal shared_ptr
que se modifique / invalide cuando weak_ptr
se reinicia el / an asociado ? Estoy un poco confundido acerca de los resultados que obtuve. A decir verdad, no esperaba este resultado ...
EDITAR 1
Si bien el error ocurre en la configuración de 64 bits , no ocurre en 32 bits . En esta configuración posterior, el resultado es lo que se espera.
EDITAR 2
El error ocurre solo en Debug . Cuando construyo en Release , obtengo el resultado esperado.
fuente
-572662307 = 0xDDDDDDDD
que es la forma en que msvc indica la memoria de montón liberadaRespuestas:
Parece que es un error real en el lado de Intel ICC; Lo he reportado.
Gracias de nuevo por ayudarme a señalar este problema.
fuente
Parece un error en la biblioteca de depuración, con valores centinela. Es fácil de verificar, usando la línea que mencioné:
Si la salida es en
2 2
lugar de1 2
, entonces el compilador no es compatible y posiblemente todavía considere ese caso como un UB. Los valores centinela pueden usarse erróneamente en este caso con call ofreset()
. Algo similar ocurre con la eliminación de objetos creados mediante la colocación de nuevos en el búfer estático preasignado, en el modo de depuración se sobrescribe con algunas implementaciones con valores centinela.fuente
1 2
en 64 bits y 32 bits , depuración y lanzamiento ._Ref_count_base
cTor predeterminado que se especifica= default
. Los dos miembros_Uses = 1
y_Weaks = 1
se establecen en1
y0
respectivamente. Parece que el cTor generado por defecto tiene errores. Ver elmemory
archivo ...