Warum erstellt QSharedPointerT :: den Aufrufdestruktor des unvollständigen Objekts?

8

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:

%Vor%

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.

    
Yrchgrchh 15.12.2015, 14:08
quelle

2 Antworten

5

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 :

%Vor%

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.

    
John Zwinck 15.12.2015, 14:51
quelle
-1

Schließlich werden wir es behoben ! Ich denke, es wäre Qt 5.8.2 oder Qt 5.9.

Danke @JohnZwinck, deine Idee funktioniert gut.

    
Youw 11.04.2017 19:35
quelle

Tags und Links