Windows 10 Application Verifier、x64 バージョン 10.0.10586 を使用しています。「リーク」を含むすべての「基本」チェックボックスがオンになっています。Application Verifier は、malloc 呼び出しがページの最後でメモリを返すため、興味深いことに、メモリのページ保護ヒープを実装しています。
DLL コード:
extern "C" __declspec(dllexport) void LeakMemory()
{
malloc(1);
VirtualAlloc(nullptr, 4096, MEM_COMMIT, PAGE_READWRITE);
}
メインコード:
#include <Windows.h>
#include <crtdbg.h>
int main(int, char**)
{
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
HMODULE h = LoadLibraryW(L"DLLProject.dll");
void(*pLeakMemory)() = reinterpret_cast<void(*)()>(GetProcAddress(h, "LeakMemory"));
pLeakMemory();
FreeLibrary(h);
printf("bye\n");
return 0;
}
出力は次のとおりです。
Page heap: pid 0xFE8: page heap enabled with flags 0x3.
AVRF: ConsoleApplication4.exe: pid 0xFE8: flags 0x81643027: application verifier enabled
bye
The program '[11172] TestProject.exe' has exited with code 0 (0x0).
アプリ検証ツールは、どちらのリークも報告できません。
_CrtDbgFlag 呼び出しを有効にすると、アプリのシャットダウン時にこれも出力することで、実際に malloc がリークしたことを確認できます。
Detected memory leaks!
Dumping objects ->
{74} normal block at 0x0000015C0979EFF0, 1 bytes long.
Data: < > CD
Object dump complete.
Application Verifier が機能しないのはなぜですか? また、メモリを DLL ではなく main() に割り当てると、リークを見つけることができませんが、それは既知の制限だと思います。