被调用函数的Gettin行号

时间:2010-12-15 16:49:06

标签: c++ solaris

如果我能做到,请告诉我?

我正在编写一个可以在C ++中跟踪内存分配和解除分配的库。简而言之,我试图看看我的应用程序是否没有任何内存泄漏。这就是我到目前为止所做的。

立即覆盖new和delete运算符。每当应用程序使用new时,我计划存储该调用中分配的地址和字节数。同样,当在该地址上调用delete时,我将从存储的列表中删除它。直到现在它的罚款。但我想存储文件名和调用“new”的行号。我只能在被覆盖的新事物中做到这一点。有没有办法在重写函数中获取行号?


1    int main()
2    {
3       // Say, A is a structure
4        A *a = new A();
5        return 0;
6     }
7    void* operator new( size )
8    {
9        //
10       // store the line number and file name on line 4 ??? Can I do it?
11       return (malloc(size));
12   }
------------------------

3 个答案:

答案 0 :(得分:3)

__LINE__给出行号 而且__FUNCTION____FILE__真的很有帮助,给出了封闭函数的const char *和文件名。编辑:(__FUNCTION__不是标准的,但有几个编译器支持) 但遗憾的是这些宏只能取得它们的价值。 所以你不可能要求来电者。

您应该在使用__LINE__的任何地方编写__FILE__new个宏。 :(

或者......你可以访问一堆来电者,但我不知道有什么常见的方法可以做到这一点......而且我已经搜索了很长时间,以至于认为不可能在调试模式下。

答案 1 :(得分:1)

最后,我在这个论坛中得到了一个类似线程的答案...以下代码有效...让我们说,

class A
{
    public:
    char str[1000];
    A()
    {
        strcpy(str,"Default string");
    }
    A(const char* s)
    {
        strcpy(str,s);
    }
};

void * operator new (unsigned size, char const * file, int line)
{
    cout << "File = " << file << endl;
    cout << "Line = " << line << endl;
    return( malloc(size));
}
#define new new(__FILE__, __LINE__)
int main()
{
    A *a = new A("Leak");
    printf("%s",a->str);
    delete a;
    return 0;
}

我发现答案的相关帖子...... overloading new and delete in c++

答案 2 :(得分:0)

您可以使用工作室dbx运行时检查功能来识别Solaris(http://blogs.oracle.com/janitor/entry/runtime_memory_checking)下的内存泄漏。)libumem也非常有用(http://blogs.oracle.com/pnayak/entry/finding_memory_leaks_within_solaris。)