Ich bin nicht sehr daran gewöhnt weak_ptr
und stehe vor einer ziemlich verwirrenden Situation. Ich verwende Intel XE 2019 Composer Update 5 ( Paket 2019.5.281 ) in Kombination mit Visual Studio 2019 ver. 16.2.5 . Ich kompiliere in 64-Bit. Ich benutze das Standard C ++ 17 .
Hier ist der Code für meine Spike-Lösung:
#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;
}
Die Ausgabe, die ich erwartet hatte, ist:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
... aber hier ist was ich erhalten habe:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
Was passiert gerade? Ist es normal, dass das shared_ptr
geändert / ungültig gemacht wird, wenn das / ein zugeordnetes weak_ptr
zurückgesetzt wird? Ich bin etwas verwirrt über die Ergebnisse, die ich erzielt habe. Um die Wahrheit zu sagen, ich habe dieses Ergebnis nicht erwartet ...
BEARBEITEN 1
Während der Fehler in der 64-Bit- Konfiguration auftritt , tritt er nicht in der 32-Bit - Konfiguration auf . In dieser späteren Konfiguration ist das Ergebnis das, was erwartet wird.
BEARBEITEN 2
Der Fehler tritt nur beim Debuggen auf . Wenn ich Release einbaue , erhalte ich das erwartete Ergebnis.
quelle
-572662307 = 0xDDDDDDDD
Dies ist die Methode von msvc, um den freigegebenen Heapspeicher anzuzeigenAntworten:
Es scheint, dass es sich um einen echten Fehler auf der Intel ICC-Seite handelt. Ich habe es gemeldet.
Nochmals vielen Dank, dass Sie mir geholfen haben, dieses Problem zu lokalisieren.
quelle
Es sieht aus wie ein Fehler in der Debug-Bibliothek mit Sentinel-Werten. Es ist einfach zu überprüfen, indem Sie die Zeile verwenden, die ich erwähnt habe:
Wenn die Ausgabe
2 2
anstelle von erfolgt1 2
, ist der Compiler nicht kompatibel und betrachtet einen solchen Fall möglicherweise immer noch als UB. Sentinel-Werte können in diesem Fall bei Aufruf von fälschlicherweise verwendet werdenreset()
. Ähnliches gilt für das Löschen von Objekten, die durch Platzieren eines neuen Objekts im vorab zugewiesenen statischen Puffer erstellt wurden. Im Debug-Modus wird es von einigen Implementierungen mit Sentinel-Werten überschrieben.quelle
1 2
sowohl 64-Bit als auch 32-Bit , Debug und Release ._Ref_count_base
Standard-cTor angegeben= default
. Die beiden Mitglieder_Uses = 1
und_Weaks = 1
sind auf1
und0
sind. Es scheint, dass der standardmäßig generierte cTor fehlerhaft ist. Siehe diememory
Datei ...