是什么原因造成我的内存泄漏的OpenCV

问题描述:

我想实现的OpenCV到我的应用程序,但我每次调用函数时存在内存泄漏。我想这与我如何在Visual Studio中使用库有关,但我使用空白项目对它进行了测试,并且它对于相同的设置似乎可以正常工作。是什么原因造成我的内存泄漏的OpenCV

我想落实到代码:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 

    // initialize Microsoft Foundation Classes, and print an error if failure 
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) 
    { 
     _tprintf(_T("Fatal Error: MFC initialization failed\n")); 
     nRetCode = 1; 
    } 
    else 
    { 
     // Application starts here... 

     // Time the application's execution time. 
     TIMER start; 

       // CODE TO GO HERE! 

     TIMER end; 

     TIMER elapsed; 

     elapsed = end - start; 

     __int64 ticks_per_second = start.get_frequency(); 

     // Display the resulting time... 

     double elapsed_seconds = (double)elapsed.get_time()/(double)ticks_per_second; 

     cout << "Elapsed time (seconds): " << elapsed_seconds; 
     cout << endl; 
     cout << "Press a key to continue" << endl; 

     char c; 
     cin >> c; 
    } 

    return nRetCode; 
} 

如果我实现的简单的东西:“CODE跑到这里”

cv::Mat aVar; 
在空间

,我已经把Visual Studio说,一旦程序终止,就会出现内存泄漏。任何想法可能是什么问题?

+1

内存泄漏错误可能是误导的原因有很多;一个例子是,它可以执行之前OpenCV的相关全局析构函数有机会运行,也可能显示为泄漏内存这OpenCV的不自由,但其中O/S将在进程终止。在紧密循环中运行代码时,除非您能观察到越来越多的资源消耗,否则应该没问题。 – 2013-05-07 23:53:27

就像我在最后发表的帖子说,细节是很重要的。非MFC的dll在MFC dll之前加载,并且如果在MFC退出之前没有释放任何数据,MFC会错误地将其报告为内存泄漏。这是一个known issue这是与mfc一起使用opencv时遇到的问题。解决的办法是:

  1. 静态链接MFC库(最常见的方式)

  2. 尝试解决办法迫使MFC DLL首先被装载在上述连结

  3. 延迟加载DLL作为见于this question

+0

好帖子。我只是补充说,* real *解决方案是忽略来自MFC的内存泄漏检测报告,这些报告往往不完整且具有误导性。 – 2013-05-08 01:56:39

我注意到在调试版本,MFC和OpenCV的组合也可以导致异常行为时,你还用的fopen和FREAD。 fread可能会返回错误9(存储控制块地址无效)。

此外,延迟加载OpenCV的dll文件可能会解决这个问题。