看这段正常得不能再正常的C语言源代码:
bool check_file_exists(LPCTSTR lpFileName)
{
WIN32_FIND_DATA findFileData = { 0 };
HANDLE hFind = NULL;
ULONGLONG fileSize = 0;
hFind = FindFirstFile(lpFileName, &findFileData);
if (hFind != INVALID_HANDLE_VALUE)
{
fileSize = findFileData.nFileSizeHigh;
fileSize <<= sizeof(findFileData.nFileSizeHigh) * 8;
fileSize |= findFileData.nFileSizeLow;
FindClose(hFind);
}
return (fileSize > 0);
}
这段代码通过 FindFirstFile 来搜索文件,得以判断文件是否存在。
FindFirstFile是一个很常见的Windows API。见MSDN:FindFirstFile
这段代码居然存在内存泄漏。我们用Visual Studio 2015的Diagnostic Tools来看一下:
进入函数的时候,Allocations是496,但是退出函数的时候Allocation是497,内存没有释放干净。
在执行这一句的时候,Allocation变成了498:
hFind = FindFirstFile(lpFileName, &findFileData);
执行这一句的时候,Allocation变成了497:
FindClose(hFind);
不清楚为什么内存没有释放干净,望指点。多谢!
注:FindFirstFileEx 也存在同样的问题:
hFind = FindFirstFileEx(lpFileName, FindExInfoStandard, &findFileData, FindExSearchNameMatch, NULL, 0);