2017-09-18 2 views
0

Wie ein QIMageQt: Wie ein QImage aus dem Speicher aufzuräumen

Nach Methode von mir erhalten eine konstante Referenz zu löschen oder zu einem QIMage aufzuräumen.

MyMethod(const QImage & img) { 

    // save it to a file 
    img.save("/path/to/save/the/qimage"); 

    // now I want to clan up img from memory. How should I do it? 
} 

Frage:
Wie soll ich das QImage Objekt aus dem Speicher nach dem Gebrauch reinigen?

Hinweis:
Beachten Sie, dass es sich um eine const & QImage ist. Also würde die Antwort beinhalten, die QImage in nicht-const zu werfen? Auch ich versuche zu versuchen, einen QImageData Zeiger auf die Daten & löschen Sie es. Nicht sicher, ob das hier der richtige Ansatz ist. Schlage vor.

Antwort

2

Sie benötigen eine nicht konstante Referenz oder einen Zeiger. Mit einem Zeiger ist die Antwort offensichtlich. Mit einem Verweis weisen Sie ihm einfach einen default-konstruierten QImage zu.

MyMethod(QImage & img) { 
    img.save("/path/to/save/the/qimage"); 

    img = QImage(); 
} 

Dies kann jedoch noch nicht auf den Speicher durch das Bild belegt aufzuräumen, wenn es zusätzliche QImage Instanzen das gleiche Bild verweisen. Um diese Hürde zu überwinden, müssen Sie mehrere QImage Instanzen vermeiden, die auf dasselbe Bild verweisen. Eine Qimage Instanz ist in dieser Hinsicht wie ein gemeinsamer Zeiger.

Ein Const-Cast würde in Ihrem Fall einen Konstruktionsfehler aufdecken. Ich würde es nur empfehlen.

+0

Verstehen Sie, dass 'const_cast' wird abgeraten. ABER, wenn ich einen const_cast wie folgt mache: QImage copy = const_cast (img) 'dann kopiere = QImage()'. ** Wird das "img" aufräumen? ** –

+0

Wenn ich ein shared_ptr benutze, müsste ich mir keine Gedanken über die Aufräumarbeiten machen? –

+1

Das Problem ist, dass Qt COW für viele seiner Klassen verwendet, wie QImage, QByteArray, ... Also, wenn Sie eine davon kopieren, erstellen Sie einfach eine neue Referenz auf die gleichen Daten. Sie müssen sicherstellen, dass alle Verweise auf dieselben Daten (d. H. Alle QImage-Instanzen, die auf dasselbe Bild verweisen) zerstört werden, um die referenzierten Bilddaten freizugeben. – user1095108