Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gdb执行同一语句两次_C++_C++11_Gdb - Fatal编程技术网

C++ gdb执行同一语句两次

C++ gdb执行同一语句两次,c++,c++11,gdb,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} 1#包括 2. 3int mai

在试图理解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}
1#包括
2.
3int main(int-argc,char*argv[])
4{
5国际一级;
6.
7标准:唯一性测试a&i;
8 std::unique_ptr c(a.get());
9
10返回0;
11}
当我通过gdb运行这个程序时,我注意到在第10行的“return0”指令之后,gdb再次返回执行第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) 
$gdb./unptr
GNU gdb(Ubuntu 7.9-1ubuntu1)7.9
(gdb)b干管
0x400686处的断点1:文件unptr.cpp,第4行。
(gdb)运行
启动程序:/home/sbahir/work/funstuff/cplusplus/unptr
unptr处的主断点1(argc=1,argv=0x7fffffffdae8)。cpp:4
4       {
(gdb)n
7标准:唯一性测试a&i;
(gdb)n
8 std::unique_ptr c(a.get());
(gdb)n
10返回0;
(gdb)n
8 std::unique_ptr c(a.get());
(gdb)p a
$1=std::包含0x7fffffffd9cc的唯一ptr
(gdb)p c
$2=std::包含0x7fffffffd9cc的唯一ptr
(gdb)
我无法理解为什么会发生这种情况。如果有人能解释或指出一些参考资料,那就太好了


感谢

这些可能是正在执行的
unique\u ptr
的析构函数。析构函数按与构造相反的顺序在作用域的末尾执行(在您的情况下,在
main()
的末尾)


编辑您的代码是如何不使用智能指针的一个主要示例。请阅读下面的评论,并且。

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


然而,我猜这是运行中的
c
的dtor。

我认为不会到达第二个dtor。@mAlters你能解释一下原因吗?哦,我明白了,没有仔细分析代码;)
unique\u ptr
双重删除了托管指针。虽然我认为会到达第二个dtor,但UB会发生在其中。我t首先没有分配
new
,因此第一个dtor可能会损坏堆栈。@mAlters Ohh这真的很糟糕,也没有发现。是的,你完全正确。