C++ 压倒一切;新";以及记录有关调用方的数据

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) {

我正在尝试编写一个内存分析器,到目前为止,我已经能够让我的自定义函数为malloc、free、new和delete工作。 我尝试使用
\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
和特殊的PLACEMENT
NEW
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参数。定义将完成添加额外参数的所有工作。