2017-04-25 7 views
0

Je crée QImage comme ceci:Quand puis-je supprimer les données fournies à QImage?

unsigned char* const rawImage = (unsigned char*)std::malloc(WIDTH*HEIGHT*3); 
for (...) { 
    // Populate the image here 
} 
QImage img(rawImage, WIDTH, HEIGHT, QImage::Format_RGB888); 

je puis après signal avec cette image à un autre thread (fil GUI en particulier):

emit imageRendered(img); 

Je pensais que je peux supprimer les données après:

delete rawImage; 

Mais cela provoque des erreurs de segmentation dans l'autre thread. Si je ne supprime pas l'image brute, le programme consomme toute la mémoire disponible. Comment faire une copie sécurisée de QImage pour pouvoir supprimer mes données brutes?

Répondre

0

La documentation est assez précis sur le sujet:

Le tampon doit rester valable pendant toute la durée du QImage et toutes copies qui n'ont pas été modifiés ou autrement détachés du tampon d'origine. L'image ne supprime pas le tampon à la destruction. Vous pouvez fournir un pointeur de fonction cleanupFunction avec un pointeur supplémentaire cleanupInfo qui sera appelée lorsque la dernière copie est détruite.

Vous devriez utiliser le constructeur suivant:

QImage::QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR) 

peu près ce que vous avez sans danger pour les nettoyer réelles des pointeurs.

Quant à faire une copie réelle des données, en gardant à l'esprit QImage utilise CoW, appelant une fonction non-const pourrait faire l'affaire (ont pas testé moi-même si):

uchar *QImage::bits() 

Notez que QImage utilise le partage de données implicite. Cette fonction effectue une copie en profondeur des données de pixel partagées, assurant ainsi que cette QImage est la seule à utiliser la valeur de retour actuelle.

Vous pouvez également essayer simplement auto newImage = img.copy();