- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
我正在使用 Visual Studio Express 2013 for Windows Desktop 开发一个用 C 语言编写的 Windows 命令行程序。在 Debug模式下编译时,我真的希望
我是一名优秀的程序员,十分优秀!