OpenCV:为什么*p_img1 =*p_img2不正确

use*_*873 3 c++ opencv iplimage

p_img1p_img2IplImage*先前cvLoad'ed,我想p_img1成为的副本p_img2.

写入*p_img1 = *p_img2;似乎工作正常(我可以在调试模式下检查它,以及通过显示图像),除了在该行之后,使用cvReleaseImage一个指针显然也会破坏另一个指针.我不明白,因为两个指针(两个地址)不同,只复制结构的字段.

我注意到使用p_img1 = cvCloneImage(p_img2);修复问题.

有人可以解释为什么*p_img1 = *p_img2是错的吗?有什么cvCloneImage()不同?

Geo*_*org 5

我建议你进一步阅读C++指针相关的参考资料.

p_img1p_img2指向IplImage结构的指针.

  • p_img1 指向imageheader1
  • p_img2 指向imageheader2

但是,该IplImage结构不包含图像数据,而是保存指向存储像素值的存储器位置的指针.

  • imageheader1包含指向pixeldata1的指针
  • imageheader2包含指向pixeldata2的指针

执行时*p_img1 = *p_img2,会使内容p_img1类似p_img2,从而

  • imageheader1现在包含指向pixeldata2的指针
  • imageheader2仍然包含指向pixeldata2的指针

如果未释放,pixeldata1将被取消引用并成为潜在的内存泄漏.释放时,cvReleaseImage取"指针指针"的参数,实际释放指向的图像头,因此imageheader1和imageheader2都指向无效的内存.

cvCloneImage具有内置的内存分配,它在将内容复制到内存之前实际分配新的内存块.执行p_img1 = cvCloneImage(p_img2)将导致OpenCV分配新的内存块(pixeldata3),从pixeldata2复制数据(由imageheader2指向p_img2),然后更新imageheader1(指向p_img1).

  • imageheader1包含指向pixeldata3的指针
  • imageheader2包含指向pixeldata2的指针

=> pixeldata1将被取消引用,如果未释放则会成为潜在的内存泄漏.