OpenCV:为什么 *p_img1=*p_img2 不正确
OpenCV: Why *p_img1=*p_img2 is not correct
p_img1
和 p_img2
之前被 IplImage*
加载,我希望 p_img1
成为 p_img2
.[=22= 的副本]
写 *p_img1 = *p_img2;
似乎工作正常(我可以在调试模式下检查它,也可以通过显示图像来检查),除了在那一行之后,使用 cvReleaseImage
作为一个指针显然也会摧毁另一个。我不明白,因为两个指针(两个地址)不同,只复制了结构的字段。
我注意到使用 p_img1 = cvCloneImage(p_img2);
可以解决问题。
有人可以解释为什么 *p_img1 = *p_img2
是错误的吗? cvCloneImage()
有什么不同之处?
我建议您进一步阅读与 C++ 指针相关的参考资料。
您的 p_img1
和 p_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
取参数'pointer of pointer',实际上是释放指向的imageheader,所以imageheader1和imageheader2都会指向无效内存。
cvCloneImage
具有内置的内存分配,在将内容复制到其中之前,它实际上会分配新的内存块。执行p_img1 = cvCloneImage(p_img2)
会导致OpenCV分配新的内存块(pixeldata3),从pixeldata2(p_img2
的imageheader2指向)复制数据,然后更新imageheader1(p_img1
指向)。
- imageheader1 包含指向 pixeldata3 的指针
- imageheader2 包含指向 pixeldata2 的指针
=> pixeldata1 如果不释放,将无法引用并成为潜在的内存泄漏。
p_img1
和 p_img2
之前被 IplImage*
加载,我希望 p_img1
成为 p_img2
.[=22= 的副本]
写 *p_img1 = *p_img2;
似乎工作正常(我可以在调试模式下检查它,也可以通过显示图像来检查),除了在那一行之后,使用 cvReleaseImage
作为一个指针显然也会摧毁另一个。我不明白,因为两个指针(两个地址)不同,只复制了结构的字段。
我注意到使用 p_img1 = cvCloneImage(p_img2);
可以解决问题。
有人可以解释为什么 *p_img1 = *p_img2
是错误的吗? cvCloneImage()
有什么不同之处?
我建议您进一步阅读与 C++ 指针相关的参考资料。
您的 p_img1
和 p_img2
是指向 IplImage 结构的指针。
p_img1
指向 imageheader1p_img2
指向 imageheader2
然而,IplImage
结构不包含图像数据,而是保存指向存储像素值的内存位置的指针。
- imageheader1 包含指向 pixeldata1 的指针
- imageheader2 包含指向 pixeldata2 的指针
执行*p_img1 = *p_img2
,会使p_img1
的内容与p_img2
相似,因此
- imageheader1 现在包含指向 pixeldata2 的指针
- imageheader2 仍然包含指向 pixeldata2 的指针
pixeldata1 如果不释放,将无法引用并成为潜在的内存泄漏。释放时,cvReleaseImage
取参数'pointer of pointer',实际上是释放指向的imageheader,所以imageheader1和imageheader2都会指向无效内存。
cvCloneImage
具有内置的内存分配,在将内容复制到其中之前,它实际上会分配新的内存块。执行p_img1 = cvCloneImage(p_img2)
会导致OpenCV分配新的内存块(pixeldata3),从pixeldata2(p_img2
的imageheader2指向)复制数据,然后更新imageheader1(p_img1
指向)。
- imageheader1 包含指向 pixeldata3 的指针
- imageheader2 包含指向 pixeldata2 的指针
=> pixeldata1 如果不释放,将无法引用并成为潜在的内存泄漏。