您的位置:首页 > 运维架构

OpenCV 的内存泄露问题(静态内存泄露)

2015-12-09 16:58 309 查看

场景:

一个MFC工程中, 使用了一个OpenCV的函数(cvReleaseImage)(随便一个都是). 然后我编译, Debug运行, 退出. 然后就在Output就出现内存泄露的输出.

{134} normal block at 0x00335620, 29 bytes long.
Data: <    0V3 7V3     > 00 00 00 00 30 56 33 00 37 56 33 00 00 00 00 00
{133} normal block at 0x003355A8, 57 bytes long.
Data: <    (       0U3 > 00 00 00 00 28 00 00 00 00 00 00 00 30 55 33 00
{132} normal block at 0x00335530, 54 bytes long.
Data: <    (    U3  T3 > 00 00 00 00 28 00 00 00 A8 55 33 00 B8 54 33 00
{131} normal block at 0x003354B8, 53 bytes long.
Data: <    (   0U3 8T3 > 00 00 00 00 28 00 00 00 30 55 33 00 38 54 33 00
......

说明:

1. new了忘记delete这么白痴的错误, 在这个工程中没有, 因为这个工程什么代码都没有添加, 只添加了cvReleaseImage(xxx)语句, 而且程序运行过程中并没有运行执行到cvReleaseImage.

(就是说我只是随便添加一个调用而已.)

2. 如果把cvReleaseImage调用注释掉, 就不会出现内存泄露输出.

分析:

1. 那很明显了, 就是连接了OpenCV的库之后就会产生这个内存泄露输出.

2. 创建了一个控制台工程, 使用OpenCV的库. 就没有出现这种情况.

3. 谷歌了一下, 发现也有人遇到这样的现象.

4. http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV
  (这篇文章有这么一句话: "同时最好选择“use MFC As a static library”(防止MFC中使用OpenCV的内存泄露问题)")

5. 解决方法: 在MFC工程中, 选择"Use MFC in a Static Library". 问题解决.

6. 选择"Use MFC in a Static Library"又产生了新的问题, 就是各种连接错误.

最终解决方法:

1. MFC工程还是使用默认的Use MFC  in a Shared DLL.

2. 把OpenCV编译成静态库. 我们自己工程中使用OpenCV的静态库.
http://blog.csdn.net/bagboy_taobao_com/article/details/8718745
3. 这样可以解决问题.

 

小结:

1. 在控制台工程中没有这个现象, 但是在MFC工程中就有, 非要选择"Use MFC in a Static Library".

2. 这样的问题, 不知是MFC扯蛋还是OpenCV扯蛋! 难道是我扯蛋?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV 内存泄露