为什么要两次调用毁灭?

时间:2016-11-02 14:08:33

标签: c++ gdb

我有一次撞车事故。并且我使用gdb来分析堆栈,我得到了以下结果。

13 0x00007f423c6e9670 in ?? ()
#14 0x00007f42340496d8 in ?? ()
#15 0x0000000003cef568 in ?? ()
#16 0x00000000008da861 in HuffmanEnd ()
#17 0x00000000008d4a83 in faacEncClose ()
#18 0x00000000004fd797 in RecorderSession::~RecorderSession   (this=0x7f423404ea90, __in_chrg=<value optimized out>)
at /root/Desktop/VideoRecoder/2.0/src/videorecorder/RecorderSession.cpp:203
#19 0x00000000004fdae9 in RecorderSession::~RecorderSession (this=0x7f423404ea90, __in_chrg=<value optimized out>)
at /root/Desktop/VideoRecoder/2.0/src/videorecorder/RecorderSession.cpp:203
#20 0x0000000000500d0b in RecorderSession::OnHangup (this=0x7f423404ea90) at /root/Desktop/VideoRecoder/2.0/src/videorecorder/RecorderSession.cpp:295
#21 0x000000000045e083 in CSipPhone::on_call_state (call_id=2, e=<value optimized out>)

正如我们所见,崩溃发生在HuffmanEnd。但我不明白为什么~RecorderSession被调用两次虽然我使用代码“删除这个”来删除RecorderSession对象,如下所示:     int RecorderSession :: OnHangup()     {        删除这个;        返回0;     }

“删除这个”会导致这种现象吗?

2 个答案:

答案 0 :(得分:0)

您的函数OnHangup本身可能已经从相关对象的析构函数中调用。因此,当对象已经被摧毁时,你正在自己调用delete,导致双重删除。

答案 1 :(得分:0)

您的对象似乎是通过放置new,或作为堆栈上的本地对象,或作为命名空间范围/全局,或作为另一个对象的成员来创建的。

在这种情况下,Dtor将再次被召唤。