¿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.



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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.