p_img1
和 p_img2
是 IplImage*
之前的 cvLoad'ed,我希望 p_img1
成为拷贝p_img2
。
编写 *p_img1 = *p_img2;
似乎工作正常(我可以在 Debug模式下检查它,以及通过显示图像),除了在那行之后,使用 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 如果不释放,将不会被引用并成为潜在的内存泄漏。
关于c++ - OpenCV:为什么 *p_img1=*p_img2 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772655/