在尝试理解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)
我无法理解为什么会这样。如果有人可以解释或指出对材料的一些参考,那就太好了。
由于
答案 0 :(得分:1)
从技术上讲,该程序可以以任何可想象的方式运行,包括打印“未定义的行为”,因为这就是你所拥有的。
但我猜它是c
正在运行的人。
答案 1 :(得分:0)
那些可能是被执行的unique_ptr
的析构函数。析构函数以相反的构造顺序执行,在范围的末尾(在您的情况下,在main()
的末尾)。
编辑您的代码是如何不使用智能指针的主要示例。请阅读以下评论,以及@MSalters' answer。