C++ 获取被调用函数的行号
请让我知道我能不能做 <>我正在编写一个库,可以在C++中跟踪内存分配和分配。简而言之,我正在尝试查看我的应用程序是否没有任何内存泄漏。这就是我到目前为止所做的 覆盖new和delete操作符,现在。每当应用程序使用new时,我都计划存储地址和在该调用中分配的字节数。类似地,当对该地址调用delete时,我将从存储列表中删除该地址。到目前为止,一切都很好。但是我想存储文件名和调用“new”的行号。我只能在重写的新文件中这样做。是否有方法获取重写函数中的行号C++ 获取被调用函数的行号,c++,solaris,C++,Solaris,请让我知道我能不能做 我正在编写一个库,可以在C++中跟踪内存分配和分配。简而言之,我正在尝试查看我的应用程序是否没有任何内存泄漏。这就是我到目前为止所做的 覆盖new和delete操作符,现在。每当应用程序使用new时,我都计划存储地址和在该调用中分配的字节数。类似地,当对该地址调用delete时,我将从存储列表中删除该地址。到目前为止,一切都很好。但是我想存储文件名和调用“new”的行号。我只能在重写的新文件中这样做。是否有方法获取重写函数中的行号 因为C++20可以使用 它提供: 线
因为C++20可以使用 它提供:
- 线
- 纵队
- 文件名
- 函数名
以前的C++版本,传统上宏代码<代码>αyLyxOy 给出了行号,但也<代码>函数> < /COD>和
不是标准的,但由多个编译器支持\uuuuuu函数\uuuuu
您应该在使用
new
的任何地方编写\uuuu行
和\uuuu文件
宏:(.最后,我在这个论坛的一个类似帖子中得到了答案…下面的代码起作用了…比如说
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;
}
A类
{
公众:
char-str[1000];
()
{
strcpy(str,默认字符串);
}
A(常量字符*s)
{
strcpy(str,s);
}
};
void*运算符新(无符号大小、字符常量*文件、整数行)
{
cout您可以使用studio dbx运行时检查功能来识别Solaris(.)下的内存泄漏。libumem也非常有用(.)为什么不使用Valgrind?而不重新执行控制盘?当然,除非您真的想这样做course@YuppieValgrind不在Solaris上。对于Solaris上的生产级测试,请使用DTrace,而不是编写自己的探查器。我从未使用过Valgrind,但DTrace是我的第二个选择,因为我确信我无法实现我描述的方法如上所述。如果你能负担得起,Purify将为你省去很多麻烦。或者,如果你能找到它,有一个非常小的泄漏检查工具叫做efence
,我认为源代码是可用的,你可以让它为你工作。\uuuuu LINE\uuuuu
和\uuuu FILE\uuuuu
是标准的C宏,并且不是可视的特定于工作室。\uuuuu函数\uuuuuu
不是标准的,但许多编译器都有相同的替代方案。是的……行和文件很有用,但正如你所说,它们只有在宏中使用时才有用。我在应用程序的许多进程中都有很多新闻和数据。因此,这是一个很大的难题……看起来像是最后的手段,dTraCE。我不知道dTrack,我会看一下,很好知道。dTrace在Solaris、OpenSolaris、MaOS X和FreeBSD上可用。请考虑重载运算符删除和运算符new [],运算符删除[]。,根据。您使用的编译器是什么?这在g++版本4.8.1中不起作用。我不确定这样的#define
是否符合标准。例如,重新定义return
是未定义的行为。
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;
}