gdb两次执行相同的语句

时间:2016-01-01 21:06:54

标签: c++ c++11 gdb

在尝试理解unique_ptr的功能时,我编写了以下程序

 1#include <memory>
 2
 3int main(int argc, char *argv[])
 4{
 5    int i;
 6    
 7    std::unique_ptr<int> a(&i);
 8    std::unique_ptr<int> c(a.get());
 9    
10    return 0;
11}

当我通过gdb运行这个程序时,我注意到在第10行的“return 0”指令后,gdb再次返回执行第0行。 8指令。

$ gdb ./unptr 
GNU gdb (Ubuntu 7.9-1ubuntu1) 7.9
(gdb) b main
Breakpoint 1 at 0x400686: file unptr.cpp, line 4.
(gdb) run
Starting program: /home/sbahir/work/funstuff/cplusplus/unptr 

Breakpoint 1, main (argc=1, argv=0x7fffffffdae8) at unptr.cpp:4
4       {
(gdb) n
7               std::unique_ptr<int> a(&i);
(gdb) n
8               std::unique_ptr<int> c(a.get());
(gdb) n
10              return 0;
(gdb) n
8               std::unique_ptr<int> c(a.get());
(gdb) p a
$1 = std::unique_ptr<int> containing 0x7fffffffd9cc
(gdb) p c
$2 = std::unique_ptr<int> containing 0x7fffffffd9cc
(gdb) 

我无法理解为什么会这样。如果有人可以解释或指出对材料的一些参考,那就太好了。

由于

2 个答案:

答案 0 :(得分:1)

从技术上讲,该程序可以以任何可想象的方式运行,包括打印“未定义的行为”,因为这就是你所拥有的。

但我猜它是c正在运行的人。

答案 1 :(得分:0)

那些可能是被执行的unique_ptr的析构函数。析构函数以相反的构造顺序执行,在范围的末尾(在您的情况下,在main()的末尾)。

编辑您的代码是如何不使用智能指针的主要示例。请阅读以下评论,以及@MSalters' answer