是否有可能创建宏来替换operator new
包含额外args的所有形式的重载...说__FILE__
和__LINE__
?
麻烦似乎operator new
可以用括号括或不用括号编码,因此:
类似对象的宏:
#define new new(__FILE__, __LINE__)
将取代声明,如:
A* a = new A();
和类似函数的宏:
#define new(A) new (A, __FILE__, __LINE__)
将取代声明,如:
A* a = new(std::nothrow) A();
不幸的是,尝试使用相同的标识符声明两个宏是错误的,即使它们的类型不同,因此以下操作失败:
#define new new(__FILE__, __LINE__) #define new(A) new (A, __FILE__, __LINE__) // Error: "new" already defined
由于我正在使用g ++,我希望使用它们的可变参数宏的语法会产生成功,但遗憾的是没有.下列:
#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
只匹配new(xyx) A()
,而不是new A()
.
我知道有些文章是关于为什么不可能写的,但我觉得我很亲密,必须有办法.我有什么明显的遗失吗?
这是我使用的:
在new.cpp
const char* __file__ = "unknown"; size_t __line__ = 0; void* operator new(size_t size) { void *ptr = malloc(size); record_alloc(ptr,__file__,__line__); __file__ = "unknown"; __line__ = 0; return ptr; } void delete(void *ptr) { unrecord_alloc(ptr); free(ptr); }
为了紧凑,我省略了new和delete的其他定义."record_alloc"和"unrecord_alloc"是维护包含ptr,line和file的结构的链表的函数.
在new.hpp中
extern const char* __file__; extern size_t __line__; #define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
对于g ++,"new"只扩展一次.关键是"&& 0",它使其成为假并导致使用真正的新内容.例如,
char *str = new char[100];
由预处理器扩展到
char *str = (__file__="somefile.c",__line__=some_number) && 0 ? NULL : new char [100];
因此,记录文件和行号,并调用您的自定义新函数.
这适用于任何形式的新 - 只要new.cpp中有相应的表单
你应该看看我的同事凯文的这篇优秀博客文章.我们最近有一种情况,我们想要启用这种类型的修复,以便将内存泄漏与在诊断/调试版本中分配它们的行相关联.这是一个有趣的技巧
http://blogs.msdn.com/calvin_hsia/archive/2009/01/19/9341632.aspx