5

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

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

4

2 回答 2

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

于 2009-09-08T17:39:50.227 回答
0

不,你做不到

#define new new(__FILE__, __LINE__)

但你可以这样做:

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

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

于 2009-09-08T22:17:12.957 回答