Ich habe folgendes Codebeispiel:
%Vor%Die Ausgabe für den obigen Code lautet:
%Vor% Aber wenn ich die Zeile mit std::make_shared
auskommentiere, folgt die Ausgabe:
Warum ruft QSharedPointer::create
den Destruktor des unvollständigen Objekts auf? Ist das ein Fehler oder ich vermisse etwas?
Ich habe es mit MSVC2013
+ Qt 5.5.1
und MSVC2015
+ Qt 5.6
versucht (aus Quellen erstellt). Das Ergebnis ist das gleiche.
Es scheint, dass Sie einen Fehler in Qt gefunden haben. Ich schlage vor, dass Sie einen Fehlerbericht einreichen und auf diesen etwas verwandten Fehler verweisen: Ссылка
Das Problem scheint in Ссылка - deren vereinfachter Code sieht so aus:
%Vor% Es ist ein wenig kompliziert mit Verweisen auf andere Funktionen (meistens in der gleichen Datei), aber es scheint, dass deleter
in result
gespeichert wird, bevor der Konstruktor vom Placement new
aufgerufen wird. Wenn Ihr Konstruktor ein Argument erzeugt, wird Ihr Objekt niemals vollständig konstruiert, aber das QSharedPointer result
ist bereits konstruiert und enthält den Deleter. Von dort aus ist es ein kurzer Sprung zur Funktion deleter
:
Und jetzt wird Ihr Destruktor aufgerufen, obwohl Ihr Konstruktor nie abgeschlossen wurde. Das ist undefiniertes Verhalten. Wenn Sie Pech haben, wird dies Ihren Anwendungsstatus beschädigen (weil es gegen die Regel verstößt, dass ein Destruktor nur aufgerufen wird, wenn ein Konstruktor vollständig ausgeführt wird - eine Regel, auf die sich einige Klassentypen verlassen können).
Eine mögliche Lösung (die ich nicht getestet habe, aber Sie können) ist:
%Vor%Wenn Sie das oben genannte bestätigen können, sollten Sie sich frei fühlen, es zu einem Patch zu verweben und es dem Qt-Bug-Tracker zu übermitteln. Hoffentlich werden sie mit einem funktionierenden Patch sofort akzeptiert.
Tags und Links c++ qt c++11 qsharedpointer