2

我正在尝试在我的应用程序中实现 OpenCV,但每次调用函数时都会出现内存泄漏。我想这与我在 Visual Studio 中使用该库的方式有关,但我用一个空白项目对其进行了测试,并且在相同的设置下似乎可以正常工作。

我试图实现的代码:

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

如果我实现如下简单的东西:

cv::Mat aVar;

在我放置“代码到这里!”的地方 Visual Studio 说一旦程序终止就会出现内存泄漏。任何想法可能是什么问题?

4

2 回答 2

4

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

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

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

  3. 本问题所示,延迟加载 dll 。

于 2013-05-08T01:33:15.610 回答
1

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

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

于 2016-02-23T13:03:29.590 回答