我正在使用 Windows 10 应用程序验证程序,x64 版本 10.0.10586。它勾选了所有“基本”复选框,包括“泄漏”。奇怪的是,应用程序验证程序正在为内存实现一个页面保护堆,因为 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.
为什么应用程序验证器不起作用?如果我在 main() 而不是 DLL 中分配内存,它也无法找到泄漏,但我认为这是它的一个已知限制。