C++ - 使用_CrtDumpMemoryLeaks()进行内存泄漏测试 - 不输出行号

Joh*_*ohn 16 c++ memory-leaks crt visual-studio

我正在使用Visual Studio 2010中的SDL进行游戏.我遇到了_CrtDumpMemoryLeaks()宏,并认为我会试一试.调用_CrtDumpMemoryLeaks()会将内存泄漏打印到输出窗口,但它不会显示它发生的位置.

我已经阅读了内存泄漏检测启用的MSDN文章,它解释了如果我定义_CRTDBG_MAP_ALLOC它应该输出有问题的语句的行号.在我的情况下,这不会发生.(但是,如果我直接使用malloc(),而不是使用'new',我能够让它工作.

代码:

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

int main(int argc, char *argv[]) {
    int *var = new int(5);

    _CrtDumpMemoryLeaks();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

Detected memory leaks!
Dumping objects ->
{58} normal block at 0x007D1510, 4 bytes long.
 Data: <    > 05 00 00 00 
Object dump complete.
Run Code Online (Sandbox Code Playgroud)

If _CrtDumpMemoryLeaks()在使用"new"分配时无法输出行号,然后建议其他方法来实现类似的行为.

CB *_*ley 9

当您定义_DEBUG并包含时,<crtdbg.h>您将获得一个重载operator new,它会使用其他参数来指定放置new表达式中的文件和行号.

例如

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5);
Run Code Online (Sandbox Code Playgroud)

您可以将其包装在有条件定义的宏中,例如

#ifdef _DEBUG
#define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW_PLACEMENT
#endif

int* p = new DEBUG_NEW_PLACEMENT int(5);
Run Code Online (Sandbox Code Playgroud)

虽然你确实看到人们定义一个宏new来完全隐藏这个表单客户端代码,但我个人并不推荐它,因为它打破了任何已故意使用placement new的内容,你必须确保任何使用placement new的头文件(例如许多标准头文件)包含在任何标题重新定义之前new.这样可以很容易地让new头文件中的某些内联使用无需"调整".


Taf*_*sen 8

这是Visual Leak Detector的旧版本.

试试这个:http://vld.codeplex.com/