gdb不知为何显示2次析构

Posted 金庆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb不知为何显示2次析构相关的知识,希望对你有一定的参考价值。

gdb不知为何显示2次析构

(金庆的专栏 2016.11)

gdb 显示2次 A::~A():

(gdb) bt
#0  A::~A (this=0x602010, __in_chrg=<optimized out>) at main.cpp:10
#1  0x0000000000400a96 in A::~A (this=0x602010, __in_chrg=<optimized out>)
    at main.cpp:12
#2  0x00000000004009c0 in main () at main.cpp:18

代码如下:

class A
{
public:
    A() {}
    virtual ~A() 
    {
        cout << "~A()" << endl;
    }
};

int main()
{
    A* p = new A;
    delete p;
    return 0;
}

打断点显示:2 locations:

(gdb) b A::~A
Breakpoint 1 at 0x400a40: A::~A. (2 locations)

完整的 gdb 输出:

g++ -g main.cpp
[[email protected] test]$ gdb a.out
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/jinq/test/a.out...done.
(gdb) b A::~A
Breakpoint 1 at 0x400a40: A::~A. (2 locations)
(gdb) run
Starting program: /home/jinq/test/a.out

Breakpoint 1, A::~A (this=0x602010, __in_chrg=<optimized out>) at main.cpp:12
12          }
Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.el7_2.8.x86_64 libgcc-4.8.5-4.el7.x86_64 libstdc++-4.8.5-4.el7.x86_64
(gdb) bt
#0  A::~A (this=0x602010, __in_chrg=<optimized out>) at main.cpp:12
#1  0x00000000004009c0 in main () at main.cpp:18
(gdb) s

Breakpoint 1, A::~A (this=0x602010, __in_chrg=<optimized out>) at main.cpp:10
10          {
(gdb) bt
#0  A::~A (this=0x602010, __in_chrg=<optimized out>) at main.cpp:10
#1  0x0000000000400a96 in A::~A (this=0x602010, __in_chrg=<optimized out>)
    at main.cpp:12
#2  0x00000000004009c0 in main () at main.cpp:18
(gdb) ^CQuit
(gdb)

虚析构函数并且是delete才这样。

Also see: http://lists.qt-project.org/pipermail/interest/2015-November/019691.html

已提交Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=20837

以上是关于gdb不知为何显示2次析构的主要内容,如果未能解决你的问题,请参考以下文章

为啥C++里面,析构函数会被调用两次

018-智能指针

构造函数 析构函数

c++面试题1

GDB 显示损坏的指令地址偏移

本菜鸟写了个Qt程序退出时报异常结束是怎么回事