2017-04-25 47 views
0

创建QImage这样的:何时可以删除提供给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); 

我然后发布与该图像信号到另一个线程(特别是GUI线程):

emit imageRendered(img); 

我想我以后可以删除数据:

delete rawImage; 

但是这会导致另一个线程出现分段错误。如果我不删除原始图像,程序将消耗所有可用内存。如何安全复制QImage,以便我可以删除我的原始数据?

回答

0

的文件是关于这个问题非常具体:

缓冲区必须在整个的QImage的生活并没有被修改或以其他方式从 原始缓冲区超脱所有 副本仍然有效。图像不会在销毁时删除缓冲区。 你可以用一个额外的 指针cleanupInfo当最后一个副本 破坏将被调用一起提供一个函数指针cleanupFunction

你会使用下面的构造函数:

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

差不多你有什么安全的实际清理指针。

至于使数据的实际拷贝,牢记QImage使用牛,调用非const函数可能做的伎俩(没有虽然测试它自己):

uchar *QImage::bits() 

请注意,QImage使用隐式数据共享。此功能执行共享像素数据的深层副本 ,从而确保此QImage是使用当前返回值的唯一一个 。

您也可以尝试简单auto newImage = img.copy();

相关问题