如何跟踪析构函数被调用的位置 - C++

3

我想知道在C++中是否有预定义的宏或其他东西,可以追踪析构函数何时被触发?

可能是这样的:

    class myClass{
    myClass();
    ~myClass();
    };
    myClass::~myClass(){
        printf("Object destroyed in %s.\n", __TRACEBACKMACRO__);
    }

    int main(){
    myClass tempClass;
    return 0;
    }

应该输出像这样的东西:
    Object destroyed in main().

最好也输出作用域和命名空间信息。

附加信息: FUNCTIONfunc 宏似乎只在函数中有效,而不在结构体和类中有效。有任何适用于结构体和类的宏吗?参考文献


1
https://dev59.com/EWQo5IYBdhLWcg3wXuin - Ashalynd
1
谢谢,但是作用域和命名空间信息呢? - Charles Chow
不要为每个对象都试图计算它们,只需动态分配它们,并在需要时解除分配。 - Mahmoud Fayez
5
你基本上是在问如何找到堆栈跟踪信息。这不是标准的东西,但GCC和MSVC似乎都有(不同的)方法来做到这一点。https://dev59.com/Wm865IYBdhLWcg3wR8ah https://dev59.com/5HRB5IYBdhLWcg3wLk1M#691742 - Adam
在我的程序中,析构函数被调用了50多次,断点太多了...我正在Windows上工作。 - Charles Chow
显示剩余3条评论
1个回答

4
您可以使用backtrace库,但可用性取决于平台和编译器:
  • 对于gcc编译器(Linux或MacOS X),可以显示C ++中的堆栈跟踪:

    包括 "execinfo.h" 并使用 backtrace -> backtrace_symbols -> __cxa_demangle。

  • 对于Windows:

    包括 StackWalker.h 并使用 StackWalker 类。

请参阅此文章http://oroboro.com/stack-trace-on-crash/以获取更多详细信息。

或者您可以使用Boost.Call_stack:http://melintea.github.io/Boost-Call_stack/index.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接