我试图将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;
在我放置的空间&#34;代码去这里!&#34; Visual Studio表示程序终止后会出现内存泄漏。任何想法可能是什么问题?
答案 0 :(得分:4)
就像我在你上一篇文章中所说,细节很重要。非MFC dll在MFC dll之前加载,如果在MFC退出之前没有释放任何数据,MFC会错误地将此报告为内存泄漏。这是一个known issue,这在使用opencv和mfc时会出现问题。解决方案是:
静态链接MFC库(最常见的方式)
尝试解决方法强制首先在上面的链接中加载mfc dll
延迟加载dll,如this question。
答案 1 :(得分:1)
我在调试版本中注意到,当你另外使用fopen和fread时,MFC和OpenCV的组合也会导致奇怪的行为。 fread可能返回错误9(存储控制块地址无效)。
同样,延迟加载OpenCV dll可能会解决问题。