C++ 获取被调用函数的行号

C++ 获取被调用函数的行号,c++,solaris,C++,Solaris,请让我知道我能不能做 我正在编写一个库,可以在C++中跟踪内存分配和分配。简而言之,我正在尝试查看我的应用程序是否没有任何内存泄漏。这就是我到目前为止所做的 覆盖new和delete操作符,现在。每当应用程序使用new时,我都计划存储地址和在该调用中分配的字节数。类似地,当对该地址调用delete时,我将从存储列表中删除该地址。到目前为止,一切都很好。但是我想存储文件名和调用“new”的行号。我只能在重写的新文件中这样做。是否有方法获取重写函数中的行号 因为C++20可以使用 它提供: 线

请让我知道我能不能做

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

覆盖new和delete操作符,现在。每当应用程序使用new时,我都计划存储地址和在该调用中分配的字节数。类似地,当对该地址调用delete时,我将从存储列表中删除该地址。到目前为止,一切都很好。但是我想存储文件名和调用“new”的行号。我只能在重写的新文件中这样做。是否有方法获取重写函数中的行号


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