C++ 是什么导致我的OpenCV内存泄漏

C++ 是什么导致我的OpenCV内存泄漏,c++,opencv,C++,Opencv,我试图在我的应用程序中实现OpenCV,但每次调用函数时都会出现内存泄漏。我想这与我如何在VisualStudio中使用该库有关,但我用一个空白项目对它进行了测试,它似乎在相同的设置下运行良好 我试图实现的代码: int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize Microsoft Foundation Classes, and print an error

我试图在我的应用程序中实现OpenCV,但每次调用函数时都会出现内存泄漏。我想这与我如何在VisualStudio中使用该库有关,但我用一个空白项目对它进行了测试,它似乎在相同的设置下运行良好

我试图实现的代码:

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;
}

在我放了“代码放在这里”的地方,VisualStudio说一旦程序终止,内存就会泄漏。你知道问题出在哪里吗?

就像我在你上一篇文章中说的,细节很重要。非MFC dll在MFC dll之前加载,如果在MFC退出之前没有释放任何数据,MFC会将此错误报告为内存泄漏。这是一个问题,在mfc中使用opencv时会出现问题。解决办法是:

  • 静态链接MFC库(最常用的方式)

  • 尝试解决方法,强制在上面的链接中首先加载mfc dll

  • 延迟加载DLL,如中所示


  • 我注意到在调试版本中,当您另外使用fopen和fread时,MFC和OpenCV的组合也会导致奇怪的行为。fread可能返回错误9(存储控制块地址无效)


    同样,延迟加载OpenCV DLL可能会解决此问题。

    内存泄漏错误可能会由于许多原因而产生误导;一个例子是,它可能在与OpenCV相关联的全局析构函数有机会运行之前执行,或者它可能会显示为泄漏内存,OpenCV不会释放内存,但O/S会在进程终止时释放内存。除非您在严密循环中运行代码时能够观察到资源消耗的增加,否则您应该不会有问题。我要补充的是,真正的解决方案是忽略来自MFC的内存泄漏检测报告,这些报告通常是不完整和误导性的。
    cv::Mat aVar;