2013-05-07 112 views
2

我想實現的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

回答

4

就像我在最後發表的帖子說,細節是很重要的。非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

1

我注意到在調試版本,MFC和OpenCV的組合也可以導致異常行爲時,你還用的fopen和FREAD。 fread可能會返回錯誤9(存儲控制塊地址無效)。

此外,延遲加載OpenCV的dll文件可能會解決這個問題。