2016-06-09 21 views
0

Ich versuche QTextStream zu verwenden, um von einem QString zu lesen. Da der Konstruktor die folgende Signatur hat:Besitz von QString mit QTextStream

QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite) 

(siehe the documentation)

Da der Konstruktor einen rohen Zeiger übergeben wird, frage ich mich, ob die QTextStream Eigentum an der QString nimmt oder wenn ich es zu verwalten haben in Mein Code, um sicherzustellen, dass das Objekt QString nach dem Objekt QTextStream gelöscht wird.

Ich habe keine Informationen weder in der Dokumentation noch in Suchmaschinen (z. B. Google, duckduckgo) gefunden. Alle Beispiele, die ich gefunden habe, zeigen eine QString und eine QTextStream, die die gleiche Lebensdauer haben (lokale Variablen in der gleichen Funktion), also bin ich nicht sicher, was passiert, wenn die zwei Objekte unterschiedliche Lebensdauern haben.

+1

Ich habe 'QTextStream' nicht mit diesem speziellen Konstruktor verwendet. Ich denke jedoch, dass das "QTextStream" -Objekt lediglich den "QString" zum Lesen oder Schreiben verwendet. Es übernimmt nicht den Besitz des 'QString'. –

Antwort

3

Die QTextStream übernimmt nicht den Besitz der QString.

In der Tat können Sie eine Funktion wie folgt schreiben:

void test() 
{ 
    QString s; 
    QTextStream ts(&s); 
    ///..... 
} 

Wenn die QTextStream den Besitz nimmt, in diesem Fall die QString würde zwei Mal gelöscht werden, und es wäre ein Laufzeitfehler sein. Aber dieser Code korrekt ist, so dass die QTextStream ersetzt nicht das Eigentum

3

Wenn die Dokumentation nicht speziell Zustand, der das QTextStream Objekt Eigentum nimmt, ist es ziemlich sicher ist, anzunehmen, dass dies nicht der Fall. Es wäre sonst eine ziemlich fiese Unterlassung.

Wenn Sie der Dokumentation jedoch nicht vertrauen, haben Sie zwei Möglichkeiten: Lesen Sie oder testen Sie das Verhalten im Code.

Wie sich herausstellt, übernimmt QTextStream keine Eigentumsrechte und wird niemals versuchen, die QString* zu löschen. Dies wirft die Frage auf, warum der Parameter nicht als const QString* deklariert ist, aber das ist eine ganz andere Frage.

Ich ermutige Sie, einen Komponententest zu schreiben, wenn Sie eine 100% Garantie haben möchten. Obwohl es äußerst unwahrscheinlich ist (das ist schließlich nicht PHP), ist es nur möglich, dass sich das Verhalten in einer späteren Version ändert.

+0

Der Grund, warum es nicht "const" ist, ist, dass 'QTextStream' auch in diesen schreiben kann:' stream << 2; // Die Zeichenfolge enthält jetzt "2" '. – coyotte508

+0

"Dies wirft die Frage auf, warum der Parameter nicht als const QString *" deklariert ist - weil Sie vielleicht darauf schreiben wollen. – Murphy

+0

Ahh natürlich. Habe nicht bemerkt, dass es ein Lese-Schreib-Container war. Vielen Dank. – nephtes