reset_ptr influisce su shared_ptr?


11

Non sono molto abituato ad usare weak_ptre 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_ptrche venga modificato / invalidato quando weak_ptrviene 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.



2
Penso che la tua implementazione abbia un bug. gcc produce i risultati corretti
NathanOliver

1
Impossibile riprodurre in Visual Studio 2019 (v. 16.2.5)
Frodyne,

1
No, questo sicuramente non è normale.
strano

4
Nel caso in cui aiuti il ​​debug, -572662307 = 0xDDDDDDDDche è il modo di msvc per indicare la memoria heap liberata
Eric

Risposte:


2

Sembra che sia un vero bug sul lato Intel ICC; L'ho segnalato.

Grazie ancora per avermi aiutato a individuare questo problema.


1
Potresti aggiungere un link alla segnalazione di bug nella tua risposta? In questo modo, chiunque abbia lo stesso problema può essere segnalato alla segnalazione di bug per il suo stato.
Sander De Dycker,

Preferirò aggiungere un commento una volta risolto il caso.
dom_beau,

1
Sì, per favore, aggiungi il link: questo permetterà ai lettori di aggiungere le loro osservazioni al rapporto.
Halfer

Non vedo come. Se raggiungi il link, hai bisogno di un account Intel per vederlo ??? Forse sto sbagliando??? Dimmi ... Ho aperto un biglietto ed è nel mio account.
dom_beau

Forse puoi raggiungere la discussione che sto avendo nel forum: forum del compilatore C ++
dom_beau

1

Sembra un bug nella libreria di debug, con valori sentinella. È facile da controllare, usando la linea che ho citato:

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

Se l'output è 2 2invece di 1 2, allora il compilatore non è conforme e probabilmente considera comunque un UB. I valori di Sentinel possono essere utilizzati erroneamente in questo caso con call of reset(). Una cosa simile accade quando si elimina un oggetto creato posizionando un nuovo all'interno di un buffer statico preallocato, in modalità debug viene sovrascritto da alcune implementazioni con valori sentinella.


1 2sia a 64-bit e 32-bit , debug e di rilascio .
dom_beau,

2
Il bug è nel _Ref_count_basecTor predefinito che è specificato = default. I due membri _Uses = 1e _Weaks = 1sono impostati su 1e 0rispettivamente. Sembra che il cTor generato di default sia corretto. Vedi il memoryfile ...
dom_beau

@dom_beau bene, vale la pena di un rapporto, anche sappiamo che l'inizializzazione in C ++ è seriamente Bonkers
Swift - Friday Pie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.