메모리릭 질문입니다 (원인은 찾았습니다)
HANDLE hDir = CreateFileW(L"D:\\", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
CONST DWORD cbBuffer = 1024*1024;
BYTE* pBuffer = (PBYTE)malloc(cbBuffer);
BOOL bWatchSubtree = FALSE;
DWORD dwNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION;
DWORD bytesReturned;
WCHAR temp[MAX_PATH] = { 0 };
for(;;)
{
FILE_NOTIFY_INFORMATION* pfni;
BOOL fOk = ReadDirectoryChangesW(hDir, pBuffer, cbBuffer,
bWatchSubtree, dwNotifyFilter, &bytesReturned, 0, 0);
if(!fOk)
{
DWORD dwLastError = GetLastError();
printf("error : %d\n", dwLastError);
break;
}
pfni = (FILE_NOTIFY_INFORMATION*)pBuffer;
do {
printf("NextEntryOffset(%d)\n", pfni->NextEntryOffset);
switch(pfni->Action)
{
case FILE_ACTION_ADDED:
wprintf(L"FILE_ACTION_ADDED\n");
break;
case FILE_ACTION_REMOVED:
wprintf(L"FILE_ACTION_REMOVED\n");
break;
case FILE_ACTION_MODIFIED:
wprintf(L"FILE_ACTION_MODIFIED\n");
break;
case FILE_ACTION_RENAMED_OLD_NAME:
wprintf(L"FILE_ACTION_RENAMED_OLD_NAME\n");
break;
case FILE_ACTION_RENAMED_NEW_NAME:
wprintf(L"FILE_ACTION_RENAMED_NEW_NAME\n");
break;
default:
break;
}
printf("FileNameLength(%d)\n", pfni->FileNameLength);
StringCbCopyNW(temp, sizeof(temp), pfni->FileName, pfni->FileNameLength);
wprintf(L"FileName(%s)\n", temp);
pfni = (FILE_NOTIFY_INFORMATION*)((PBYTE)pfni + pfni->NextEntryOffset);
} while(pfni->NextEntryOffset > 0);
}
free(pBuffer);
이 부분에서 메모리 릭이 발생하고 있는데 어딘지 짐작이 안가고 있습니다.. 이유와 해결책 좀 알려주시면 감사하겠습니다
ps. 원인은 찾았습니다. CONST DWORD cbBuffer = 1024*1024; 이부분이네요
근데 이부분을 줄여버리면 프로그램이 죽어버리고 그렇다고 그대로 두면 메모리릭이 계속해서 발생하고
처리는 해야할거 같은데 방법이 없을까요?
댓글 달기