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

场景:

一个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)