[英]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提供:
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.