代码之家  ›  专栏  ›  技术社区  ›  Gayan

覆盖“新建”并记录有关调用方的数据

  •  5
  • Gayan  · 技术社区  · 15 年前

    我正在尝试编写一个内存分析器,到目前为止,我已经能够让我的自定义函数为malloc、free、new和delete工作。 __FILE__ __LINE__ 将发起者记录在重载的新方法中,但是(正如预期的那样),它只给出重载函数所在位置的详细信息。

    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 回复  |  直到 15 年前
        1
  •  4
  •   B.S.    15 年前

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

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

        2
  •  0
  •   teZeriusz    15 年前

    不,你不能这么做

    #define new new(__FILE__, __LINE__)
    

    但你可以做到:

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

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