覆盖关于调用者的"新"和记录数据

Gay*_*yan 5 c++ malloc new-operator

我正在尝试编写内存分析器,到目前为止我已经能够使我的自定义函数适用于malloc,free,new和delete.我尝试使用__FILE____LINE__在重载的新方法中记录发起者,但是(正如预期的那样)它只是给出了重载函数的详细信息.有没有办法在没有对正在测试的组件的现有代码进行任何更改的情况下(例如#malline 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;
}
Run Code Online (Sandbox Code Playgroud)

bool b_MemProfStarted用于避免对ofstream和map.insert的递归调用.

B.S*_*.S. 5

你可以写

new(foo, bar) MyClass;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,调用以下函数

void*operator new(std::size_t, Foo, Bar){
    ...
}
Run Code Online (Sandbox Code Playgroud)

您现在可以致电

new(__LINE__, __FILE__) MyClass;
Run Code Online (Sandbox Code Playgroud)

并使用数据

void*operator new(std::size_t, unsigned line, const char*file){
    ...
}
Run Code Online (Sandbox Code Playgroud)

添加宏

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

被监视的代码将捕获大多数调用,而无需更改源代码。

它并不完美,因为您可以直接调用运算符 new 。在这种情况下,预处理器会将您的代码变成垃圾。但我不知道有更好的办法。