我有一次撞车事故。并且我使用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; }
“删除这个”会导致这种现象吗?
答案 0 :(得分:0)
您的函数OnHangup
本身可能已经从相关对象的析构函数中调用。因此,当对象已经被摧毁时,你正在自己调用delete
,导致双重删除。
答案 1 :(得分:0)
您的对象似乎是通过放置new,或作为堆栈上的本地对象,或作为命名空间范围/全局,或作为另一个对象的成员来创建的。
在这种情况下,Dtor将再次被召唤。