相关疑难解决方法(0)

宏替换C++运算符new

是否有可能创建宏来替换operator new包含额外args的所有形式的重载...说__FILE____LINE__

麻烦似乎operator new可以用括号括或不用括号编码,因此:

不幸的是,尝试使用相同的标识符声明两个宏是错误的,即使它们的类型不同,因此以下操作失败:

#define new new(__FILE__, __LINE__)
#define new(A) new (A, __FILE__, __LINE__) // Error: "new" already defined
Run Code Online (Sandbox Code Playgroud)

由于我正在使用g ++,我希望使用它们的可变参数宏的语法会产生成功,但遗憾的是没有.下列:

#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

只匹配new(xyx) A(),而不是new A().

我知道有些文章是关于为什么不可能写的 …

c++ gcc c-preprocessor

26
推荐指数
3
解决办法
2万
查看次数

使用placement new替换new与宏冲突

我有一个庞大的应用程序(数百万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应用程序编译得很好.但是如果没有这种解决办法,我的庞大应用程序就不会.

所以我的问题是:

  1. 有没有人能够完全宏观化,而不会摇晃大量的代码?(以相对无痛的方式)
  2. 任何其他方式绕过重新安排我的STL标头包括指令?

谢谢

c++ windows memory-leaks crtdbg.h

7
推荐指数
1
解决办法
1983
查看次数

DEBUG_NEW和__FILE__的用法是什么?

我看到了跟随宏,

#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Run Code Online (Sandbox Code Playgroud)

上面宏的用法是什么?

谢谢

c++

6
推荐指数
2
解决办法
7631
查看次数

标签 统计

c++ ×3

c-preprocessor ×1

crtdbg.h ×1

gcc ×1

memory-leaks ×1

windows ×1