¿reset_ptr débil afecta a shared_ptr?

11

No estoy muy acostumbrado a usar weak_ptry 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_ptrque se modifique / invalide cuando weak_ptrse 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.

dom_beau
fuente
2
Creo que tu implementación tiene un error. gcc produce los resultados correctos
NathanOliver
1
No se puede reproducir en Visual Studio 2019 (v. 16.2.5)
Frodyne
1
No, esto definitivamente no es normal.
extraño
44
En caso de que ayude a la depuración, -572662307 = 0xDDDDDDDDque es la forma en que msvc indica la memoria de montón liberada
Eric

Respuestas:

2

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.

dom_beau
fuente
1
¿Podría agregar un enlace al informe de error en su respuesta? De esa manera, cualquier persona con el mismo problema puede ser referida al informe de errores para conocer su estado.
Sander De Dycker
Prefiero agregar un comentario una vez que se solucione el caso.
dom_beau
1
Sí, por favor agregue el enlace; esto permitirá a los lectores agregar sus propios comentarios al informe.
halfer
No veo como. Si llega al enlace, ¿necesita una cuenta Intel para verlo? ¿¿¿Puede ser que esté equivocado??? Dime ... Abrí un boleto y está en mi cuenta.
dom_beau
Quizás puedas llegar a la discusión que estoy teniendo en el foro: foro del compilador de C ++
dom_beau
1

Parece un error en la biblioteca de depuración, con valores centinela. Es fácil de verificar, usando la línea que mencioné:

int i = 1; cout << i << " " << ++i << endl;

Si la salida es en 2 2lugar de 1 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 of reset(). 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.

Swift - Friday Pie
fuente
Da 1 2en 64 bits y 32 bits , depuración y lanzamiento .
dom_beau
2
El error está en _Ref_count_basecTor predeterminado que se especifica = default. Los dos miembros _Uses = 1y _Weaks = 1se establecen en 1y 0respectivamente. Parece que el cTor generado por defecto tiene errores. Ver el memoryarchivo ...
dom_beau
@dom_beau bueno, vale la pena un informe, también sabemos que la inicialización en C ++ es seriamente loco
Swift - Friday Pie