请让我知道我是否可以做到?

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

现在覆盖new和delete运算符。每当应用程序使用new时,我都计划存储该调用中分配的地址和字节数。同样,当在该地址上调用删除时,我将从存储的列表中删除它。到现在为止还不错。但是我想存储文件名和行号,从那里被称为"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   }
------------------------

最佳答案

从C++ 20开始,您可以使用std::source_location
提供:

  • 文件名
  • function_name

  • 对于以前的C++版本,传统上宏__LINE__给出行号,但是__FUNCTION____FILE__确实很有用,给出了封装函数的const char *和文件名。
    实际上,__FUNCTION__不是标准的,但几个编译器都支持。
    不幸的是,这些宏仅发挥其值(value)。
    因此,您不可能要求 call 者。
    您应该在所有使用__LINE__的地方编写__FILE__new宏。 :(。

    关于c++ - 获取被调用函数的行号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4452557/

    10-13 08:19