2016-01-01 92 views
1

雖然試圖瞭解的unique_ptr的功能,我寫了下面的程序GDB執行相同的語句兩次

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我注意到,經過「返回0」線10號指令,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) 

我不明白爲什麼會發生這種情況。如果有人能夠解釋或指出一些材料的參考,那將是非常好的。

感謝

回答

1

從技術上講,程序可以以任何可以想象的方式行爲,包括打印「未定義的行爲」,因爲這就是你所擁有的。

不過我猜想這是c的運轉。

0

這些都是可能的unique_ptr的正在執行的析構函數。在範圍的最後(在你的情況下,在main()的末尾),析構函數按照相反的構造順序執行。

編輯您的代碼是的主要示例如何不使用智能指針。請閱讀下面的評論,以及@MSalters' answer

+0

我不認爲會達到第二個dtor。 – MSalters

+0

@MSalters你能解釋爲什麼嗎?哦,我明白了,沒有真正仔細分析代碼;)'unique_ptr'雙重刪除了託管指針。雖然我認爲第二輪戰鬥將會到達,但是UB會在其內部發生。 – vsoftco

+0

首先它並沒有用'new'分配,所以第一個可能會破壞堆棧。 – MSalters