use*_*873 3 c++ opencv iplimage
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()不同?
我建议你进一步阅读C++指针相关的参考资料.
你p_img1和p_img2指向IplImage结构的指针.
p_img1 指向imageheader1p_img2 指向imageheader2但是,该IplImage结构不包含图像数据,而是保存指向存储像素值的存储器位置的指针.
执行时*p_img1 = *p_img2,会使内容p_img1类似p_img2,从而
如果未释放,pixeldata1将被取消引用并成为潜在的内存泄漏.释放时,cvReleaseImage取"指针指针"的参数,实际释放指向的图像头,因此imageheader1和imageheader2都指向无效的内存.
cvCloneImage具有内置的内存分配,它在将内容复制到内存之前实际分配新的内存块.执行p_img1 = cvCloneImage(p_img2)将导致OpenCV分配新的内存块(pixeldata3),从pixeldata2复制数据(由imageheader2指向p_img2),然后更新imageheader1(指向p_img1).
=> pixeldata1将被取消引用,如果未释放则会成为潜在的内存泄漏.
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |