我在下面放置的代码中存在泄漏。当我使用 cvCreateImage 而不是 cvCreateImageHeader 时,泄漏量为 304Kb 和 107b,但当我更改时,泄漏量仅为 107 字节。
你能帮我找到泄漏点吗?
+ (IplImage *) nsImageToIplImage:(NSImage *)image {
// NSImage to IplImage
NSBitmapImageRep *orig = [[image representations] objectAtIndex: 0];
// a copy or else the color-channel shift that we do later on will affect the original NSImage!
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[orig representationUsingType:NSTIFFFileType properties:NULL]];
int depth = [rep bitsPerSample];
int channels = [rep samplesPerPixel];
int height = [rep size].height;
int width = [rep size].width;
// note- channels had better be "3", or else the loop down below will act pretty funky...
// NSTIFFFileType seems to always give three-channel images, so I think it's okay...
IplImage *to_return = cvCreateImageHeader(cvSize(width, height), depth, channels);
cvSetImageData(to_return, [rep bitmapData], [rep bytesPerRow]);
// Reorder BGR to RGB
// no, I don't know why it's in BGR after cvSetData
for (int i = 0; i < to_return->imageSize; i += 3) {
uchar tempR, tempG, tempB;
tempR = to_return->imageData[i];
tempG = to_return->imageData[i+1];
tempB = to_return->imageData[i+2];
to_return->imageData[i] = tempR;
to_return->imageData[i+1] =tempG;
to_return->imageData[i+2] = tempB;
}
return to_return;
}
这是您对 cvSetImageData 的调用。当您调用 cvCreateImage 时,它会分配标头和图像数据。 cvCreateImageHeader 仅分配图像头。
当您调用 cvSetImageData 时,它不会将数据复制到结构中。相反,它只是将指针设置为指向您提供的任何数据。因此,如果调用cvCreateImage,然后调用cvSetImageData,则cvCreateImage分配的图像数据将丢失。
您这样做的方式的一个相当令人讨厌的副作用是,用户可能会调用 cvReleaseImage,这实际上会尝试释放 [rep bitmapData] 中的数据。更好的方法是简单地调用 cvCreateImage,然后将 [rep bitmapData] 中的所有数据复制到其中。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)