gpt4 book ai didi

c++ - 为什么 _CrtSetDumpClient 不工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:25 26 4
gpt4 key购买 nike

我正在使用 Visual Studio Express 2013 for Windows Desktop 开发一个用 C 语言编写的 Windows 命令行程序。在 Debug模式下编译时,我真的希望我的程序能够检测内存泄漏并将它们打印在标准错误或标准输出上,这样它们就在我面前。

调用 _CrtDumpMemoryLeaks ,我能够将内存泄漏信息打印到 Visual Studio 中的调试输出(您可以在“输出” Pane 下找到)。根据 MSDN 文档,我认为我可以添加对 _CrtSetDumpClient 的调用以便访问被转储的数据,然后将其打印到标准错误。

这是我用来测试这个问题的代码:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <stdio.h>
#include <crtdbg.h>

void dumpClient(void * userPortion, size_t blockSize)
{
printf("memory leak: %d\n", blockSize);
}

int main(int argc, char ** argv)
{
printf("hello\n");
_CrtSetDumpClient(&dumpClient);
malloc(44);
_CrtDumpMemoryLeaks();
return 0;
}

我在 Visual Studio 中创建了一个新的 Visual C++ Win32 控制台应用程序项目,将这段代码粘贴到项目中,禁用预编译 header ,确保 IDE 处于 Debug模式,然后构建。如果我按 F5(启动调试命令)运行它,那么我可以在 Visual Studio 的调试窗口中看到以下输出,这很好:

Detected memory leaks!
Dumping objects ->
c:\users\david\documents\scraps\test_vc++\testvc\testvc.cpp(15) : {81} normal block at 0x0120A500, 44 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[3868] TestVC.exe' has exited with code 0 (0x0).

但是,如果我在 dumpClient 中设置一个断点,我可以看到它永远不会被调用。此外,如果我从命令提示符运行该程序,它只会打印 hello。我希望看到的预期输出是:

hello
memory leak: 44

有谁知道为什么根本没有调用 dumpClient 函数?

最佳答案

长话短说您可以调用 _malloc_dbg(44, _CLIENT_BLOCK, filename, line) 而不是 malloc

通过查看 dbgheap.c,您可以看到可以调用您的函数的唯一方法是:

if (_BLOCK_TYPE(pHead->nBlockUse) == _CLIENT_BLOCK)
{
_RPT3(_CRT_WARN, "client block at 0x%p, subtype %x, %Iu bytes long.\n",
(BYTE *)pbData(pHead), _BLOCK_SUBTYPE(pHead->nBlockUse), pHead->nDataSize);

if (_pfnDumpClient && !__crtIsBadReadPtr(pbData(pHead), pHead->nDataSize))
{
(*_pfnDumpClient)((void *)pbData(pHead), pHead->nDataSize);
}
else
{
_printMemBlockData(plocinfo, pHead);
}
}

所以你必须有 _BLOCK_TYPE(pHead->nBlockUse) == _CLIENT_BLOCK。

调用 malloc 时,您只分配 _NORMAL_BLOCK

您可以改为调用 _malloc_dbg(44, _CLIENT_BLOCK, filename, line)http://msdn.microsoft.com/en-us/library/faz3a37z.aspx

然后你的函数将被调用。

当然,Microsoft 可以在 _CrtSetDumpClient 文档中提到这一点,但这太容易了;)

关于c++ - 为什么 _CrtSetDumpClient 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com