赞
踩
开发环境是VisualStudio2022,开发MFC程序,使用了opencv库(版本4.5.1)进行图像处理。发现当程序退出时输出窗口中报了内存泄漏:
这个内存泄漏是VS的Debug模式下开发MFC项目时自动执行检查的,应该是使用的<crtdbg.h>中的 _CrtDumpMemoryLeaks()函数将发生内存泄漏的块显示到输出窗口的
先说结论,这个内存泄漏实际上属于误报。当然,前提是你的代码本身没有问题,比如说没有使用cv::Mat指针new了之后忘记释放等等
原因在于opencv库中定义了一些单例指针,比如说opencv源代码的modules/core/src/system.cpp中定义了static Mutex* __initialization_mutex。单例指针通常不需要进行手动释放,生命周期与整个程序相同,因为是单例,也不会在程序运行过程中不断占用更多的内存。但是调用_CrtDumpMemoryLeaks(),它是不会管你生命周期如何的,只要调用的时候还没有被释放,就会报内存泄漏。在github上有很多人提了类似的issue,opencv官方的说法也是:静态指针未被释放的内存泄漏属于误报,不要管就行
在MFC程序中调用AfxEnableMemoryLeakDump(FALSE);可以阻止VS在Debug模式下自动输出找到的内存泄漏(但是你手动调用_CrtDumpMemoryLeaks还是会输出)。可以考虑使用VLD等其他内存泄漏检测工具,据说可以在检查出真正的内存泄漏的同时,忽略未释放的静态指针(我还没试,试过了再来更新)
网上说的一些其他方法,我猜基本上也是通过各种方法绕过(对opencv库)内存泄漏的检测,毕竟opencv的静态指针在程序生命周期结束前确实并没有被释放。而且代价也很大,需要对代码或配置做比较大的改动,还有可能产生新的问题,比如说使用“在静态库中使用MFC”+"多线程调试/MTd",有可能导致传入opencv函数的vector对象析构的时候报错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。