Dav*_*ron 26 c++ gcc c-preprocessor
是否有可能创建宏来替换operator new包含额外args的所有形式的重载...说__FILE__和__LINE__?
麻烦似乎operator new可以用括号括或不用括号编码,因此:
类似对象的宏:
#define new new(__FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
将取代声明,如:
A* a = new A();
Run Code Online (Sandbox Code Playgroud)和类似函数的宏:
#define new(A) new (A, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
将取代声明,如:
A* a = new(std::nothrow) A();
Run Code Online (Sandbox Code Playgroud)不幸的是,尝试使用相同的标识符声明两个宏是错误的,即使它们的类型不同,因此以下操作失败:
#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().
小智 23
这是我使用的:
在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);
}
Run Code Online (Sandbox Code Playgroud)
为了紧凑,我省略了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
Run Code Online (Sandbox Code Playgroud)
对于g ++,"new"只扩展一次.关键是"&& 0",它使其成为假并导致使用真正的新内容.例如,
char *str = new char[100];
Run Code Online (Sandbox Code Playgroud)
由预处理器扩展到
char *str = (__file__="somefile.c",__line__=some_number) && 0 ? NULL : new char [100];
Run Code Online (Sandbox Code Playgroud)
因此,记录文件和行号,并调用您的自定义新函数.
这适用于任何形式的新 - 只要new.cpp中有相应的表单
你应该看看我的同事凯文的这篇优秀博客文章.我们最近有一种情况,我们想要启用这种类型的修复,以便将内存泄漏与在诊断/调试版本中分配它们的行相关联.这是一个有趣的技巧
http://blogs.msdn.com/calvin_hsia/archive/2009/01/19/9341632.aspx
Jas*_*hen -2
不,没有办法。
在过去的糟糕日子里你可以这样做,malloc()/free()但不适合new。
您可以通过全局覆盖运算符来替换内存分配器new,但不能注入您正在讨论的特殊变量。
| 归档时间: |
|
| 查看次数: |
16200 次 |
| 最近记录: |