p_img1
和p_img2
以前是IplImage*
cvLoad' ed,我希望p_img1
成为p_img2
的副本。
写*p_img1 = *p_img2;
似乎工作正常(我可以在调试模式下检查它,以及通过显示图像),除了在该行之后,使用cvReleaseImage
作为一个指针显然也会破坏另外一个。我不理解它,因为两个指针(两个地址)不同,只复制了结构的字段。
我注意到使用p_img1 = cvCloneImage(p_img2);
修复了问题。
有人可以解释为什么*p_img1 = *p_img2
错了吗? cvCloneImage()
的做法有何不同?
答案 0 :(得分:5)
我建议你进一步阅读与C ++指针相关的引用。
您的p_img1
和p_img2
是指向IplImage结构的指针。
p_img1
指向imageheader1 p_img2
指向imageheader2 但是,IplImage
结构不包含图像数据,而是保存指向存储像素值的内存位置的指针。
执行*p_img1 = *p_img2
会使p_img1
的内容与p_img2
类似,因此
pixeldata1将被取消引用并成为潜在的内存泄漏。释放时,cvReleaseImage
接受指针'指针的参数,实际释放指向的图像头,因此imageheader1和imageheader2都将指向无效的内存。
cvCloneImage
具有内置内存分配功能,在将内容复制到内存之前,它实际上会分配新的内存块。执行p_img1 = cvCloneImage(p_img2)
将导致OpenCV分配新的内存块(pixeldata3),从pixeldata2复制数据(由p_img2
的imageheader2指向),然后更新imageheader1(由p_img1
指向)。
=>如果未释放,pixeldata1将被取消引用并成为潜在的内存泄漏。