2017-09-18 10 views
0

Comment effacer ou nettoyer une méthode Après QIMageQt: Comment nettoyer un QImage de la mémoire

de mes obtenir une référence const à un QIMage.

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? 
} 

Question:
Comment dois-je nettoyer l'objet QImage de la mémoire après utilisation?

Note:
Notez qu'il est un const & QImage. Donc, réponse impliquerait de couler le QImage en non-const? En outre, je cherche à obtenir un pointeur QImageData aux données & le supprimer. Je ne sais pas si c'est la bonne approche ici. Ne suggérer.

Répondre

2

Vous avez besoin d'une référence non const ou d'un pointeur. Avec un pointeur, la réponse est évidente. Avec une référence, vous lui attribuez simplement un QImage par défaut.

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

    img = QImage(); 
} 

Cependant, cela peut toujours pas nettoyer la mémoire occupée par l'image, s'il y a des cas QImage supplémentaires faisant référence à cette même image. Pour surmonter cet obstacle, vous devez éviter plusieurs instances QImage référençant la même image. Une instance Qimage est comme un pointeur partagé à cet égard.

Un const-cast serait considéré comme révélateur d'un défaut de conception dans votre boîtier. Je recommanderais contre.

+0

Comprenez que 'const_cast' est déconseillé. MAIS, si je fais une const_cast comme ceci 'QImage copy = const_cast (img)' alors faites 'copy = QImage()'. ** Est-ce que cela va nettoyer 'img'? ** –

+0

Si j'utilise un shared_ptr alors je n'aurais pas à me soucier du nettoyage? –

+1

Le problème est que Qt utilise COW sur beaucoup de ses classes, comme QImage, QByteArray, ... Donc, quand vous copiez l'un de ceux-ci, vous créez simplement une nouvelle référence aux mêmes données. Vous devez vous assurer que toutes les références aux mêmes données (c'est-à-dire toutes les instances QImage référençant la même image) sont détruites pour libérer les données d'image référencées. – user1095108