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

时间:2009-09-08 17:24:16

标签: c++ malloc new-operator

我正在尝试编写一个内存分析器,到目前为止我已经能够使我的自定义函数适用于malloc,free,new和delete。 我尝试使用__FILE____LINE__在重载的新方法中记录发起者,但是(正如预期的那样)它只是给出了重载函数的详细信息。 有没有办法在不对正在测试的组件的现有代码进行任何更改的情况下(如#mallf的#define)对重载函数获取有关创建者的详细信息?

我正在使用的功能是:

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;
}

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

2 个答案:

答案 0 :(得分:4)

你可以写

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。在这种情况下,预处理器会将您的代码变为垃圾。我知道没有更好的方法。

答案 1 :(得分:0)

不,你不能做

#define new new(__FILE__, __LINE__)

但你可以这样做:

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

看看: http://sourceforge.net/projects/nvwa/