C++ 压倒一切;新";以及记录有关调用方的数据
我正在尝试编写一个内存分析器,到目前为止,我已经能够让我的自定义函数为malloc、free、new和delete工作。 我尝试使用C++ 压倒一切;新";以及记录有关调用方的数据,c++,malloc,new-operator,C++,Malloc,New Operator,我正在尝试编写一个内存分析器,到目前为止,我已经能够让我的自定义函数为malloc、free、new和delete工作。 我尝试使用\uuuuu FILE\uuuuuu和\uuuu LINE\uuuuu在重载的新方法中记录发起者,但是(正如预期的那样)它只给出了重载函数的详细位置。 有没有一种方法可以在不更改被测试组件的现有代码(如#define for malloc)的情况下获得重载函数的发起人的详细信息 我使用的函数是: void* operator new (size_t size) {
\uuuuu FILE\uuuuuu
和\uuuu LINE\uuuuu
在重载的新方法中记录发起者,但是(正如预期的那样)它只给出了重载函数的详细位置。
有没有一种方法可以在不更改被测试组件的现有代码(如#define for malloc)的情况下获得重载函数的发起人的详细信息
我使用的函数是:
void* operator new (size_t size)
{
if(b_MemProfStarted)
{
b_MemProfStarted = false;
o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":"
<< __LINE__ << endl;
b_MemProfStarted = true;
}
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
void*运算符新建(大小)
{
如果(b_memprof启动)
{
b_MemProfStarted=false;
o_MemLogFile您可以编写
new(foo, bar) MyClass;
在这种情况下,调用以下函数
void*operator new(std::size_t, Foo, Bar){
...
}
你现在可以打电话了
new(__LINE__, __FILE__) MyClass;
并将数据与
void*operator new(std::size_t, unsigned line, const char*file){
...
}
添加宏
#define new new(__LINE__, __FILE__)
对被监视的代码的修改将捕获大多数调用,而无需更改源代码
例如,它并不完美,因为您可以直接调用运算符new。在这种情况下,预处理器会将您的代码变成垃圾。但我知道没有更好的方法。不,您不能这样做
#define new new(__FILE__, __LINE__)
但你可以做到:
#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW
看看:
由于new
是一个关键字,试图用宏重新定义它是未定义的行为(编译器特定扩展除外).我更喜欢为'normal'NEW
s有条件地定义一个DEBUG\u NEW\u PLACEMENT宏,并单独保留显式的运算符NEW
和特殊的PLACEMENTNEW
s。这仍然不是一个很好的解决方案,尽管如此。voidoperator NEW(std::size\t,unsigned line,const charfile)将失败,因为“NEW”只取大小。无法使用“#define new new(LINE,FILE)”和操作符override在一起,因为它会尝试替换override函数定义中的“new”。voidoperator new(std::size\u t)->voidoperator new(LINE,FILE)/*递归?*/(std::size\u t)@Charles Bailey-你能详细说明一下吗?我不熟悉调试新的位置,我试过”#define new(size)My\u new(大小、文件、行)“但在执行“新建”时,似乎不会调用此选项"@Gayan您可以使用附加参数定义运算符new。您甚至可以使用它们重载。在调用new时,必须传递附加参数,如上所示。当然,在编写实际重载时,您必须确保没有定义宏。在使用过度使用的新函数而不是常规函数时w、 您不包括size\u t参数。定义将完成添加额外参数的所有工作。