C J*_*son 7 c++ windows memory-leaks crtdbg.h
我有一个庞大的应用程序(数百万LOC,和数万个文件),我正在尝试使用debug crt来检测内存泄漏.我正试图像这样宏观化:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifndef NEW_DEBUG
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new NEW_DEBUG
#endif
Run Code Online (Sandbox Code Playgroud)
现在,我的应用程序是如此之大,所以对我而言,理想情况下,我会把它放在一个头文件中,特别是包含在成千上万的CPP文件中.不是一个有趣的任务.所以我试图将它放在SDK中的公共头文件中,该文件将包含在每个转换单元中.
我遇到的问题是它似乎与一些STL头文件冲突,并且编译器在使用placement new时发出错误.我可以通过使用pragma和禁用新宏在我自己的代码中更改它.那不是问题.这是使用贴牌新的STL头文件,我无法改变.
通过重新排列cpp文件中的include指令,我找到了解决方法.例如:
// doesn't compile
#include "new_redirect.h"
#include <map> // for instance
// does compile
#include <map> // for instance
#include "new_redirect.h"
Run Code Online (Sandbox Code Playgroud)
但这是一个困难的解决办法,因为我必须再修改数千个文件,并确保他们的STL标题包含在其他任何内容之前.具有讽刺意味的是,我创建了一个hello world应用程序来专门测试这个问题:我的hello-world应用程序编译得很好.但是如果没有这种解决办法,我的庞大应用程序就不会.
所以我的问题是:
谢谢
您可以使用可变参数宏捕获新的位置:
#define NEW_DEBUG(...) NEW_DEBUG2(_NORMAL_BLOCK, __FILE__, __LINE__, __VA_ARGS__ )
#define new NEW_DEBUG
Run Code Online (Sandbox Code Playgroud)
但是预处理器似乎不允许定义带参数和不带参数的宏,并且首先应用不带参数的宏,所以我没有找到一种方法来通过单个预处理器传递来完成此操作。但似乎有可能有两个,如果我们使用上面的宏和 /E 运行第一遍,然后使用第二遍
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define NEW_DEBUG2(...) new(__VA_ARGS__ )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1983 次 |
| 最近记录: |