简体   繁体   English

获取被调用函数的行号

[英]Gettin line number of the called function

Please let me know if I can do it or not?请让我知道我是否可以做到?

I am writing a library that could work to track memory allocation and de-allocation in C++.我正在编写一个可以在 C++ 中跟踪内存分配和取消分配的库。 In short, I am trying to see if my application does not have any memory leaks.简而言之,我想看看我的应用程序是否没有任何内存泄漏。 This is what I did so far.这是我到目前为止所做的。

Overrode the new and the delete operator and now.覆盖 new 和 delete 运算符,现在。 Whenever the application uses new, I am planning to store the address and the number of bytes that are allocated in that call.每当应用程序使用 new 时,我都计划存储在该调用中分配的地址和字节数。 Similarly, when the delete is called on that address, I will remove that from the stored list.同样,当对该地址调用删除时,我将从存储列表中删除它。 Until now its fine.直到现在还好。 But I want to store the file name and the line number from where the "new" is called.但我想存储调用“new”的文件名和行号。 I can do that only in the overridden new.我只能在被覆盖的 new 中做到这一点。 Is there a way to get line number in the overridden function?有没有办法在重写的函数中获取行号?


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

Since C++20 you can use std::source_location which offers:从 C++20 开始,您可以使用std::source_location提供:

  • line线
  • column柱子
  • file_name文件名
  • function_name函数名

For previous versions of C++, traditionnally the macros __LINE__ gives the line number but also __FUNCTION__ and __FILE__ are really helpful, giving the const char* of the enclosing function, and file name.对于以前版本的 C++,传统上宏__LINE__给出了行号,但__FUNCTION____FILE__也非常有用,给出了封闭函数的 const char* 和文件名。

Indeedn, __FUNCTION__ is not standard but supported by several compilers.事实上, __FUNCTION__不是标准的,但有几个编译器支持。

Unfortunately these macros only take their value in place.不幸的是,这些宏只发挥了它们的价值。 So it is not possible for you to ask for the caller.因此,您不可能要求呼叫者。

You should write the __LINE__ and __FILE__ macros everywhere you use new .您应该在任何使用new地方编写__LINE____FILE__宏。 :(. :(。

Finally I got an answer by one of similar threads in this forum... The following code worked... Lets say,最后我得到了这个论坛中一个类似线程的答案......下面的代码有效......让我们说,

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

Related post where I found the answer... overloading new and delete in c++我找到答案的相关帖子... 在 C++ 中重载 new 和 delete

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM