雖然試圖瞭解的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)
我不明白爲什麼會發生這種情況。如果有人能夠解釋或指出一些材料的參考,那將是非常好的。
感謝
我不認爲會達到第二個dtor。 – MSalters
@MSalters你能解釋爲什麼嗎?哦,我明白了,沒有真正仔細分析代碼;)'unique_ptr'雙重刪除了託管指針。雖然我認爲第二輪戰鬥將會到達,但是UB會在其內部發生。 – vsoftco
首先它並沒有用'new'分配,所以第一個可能會破壞堆棧。 – MSalters