При попытке понять функциональность 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 снова возвращается к исполнению строки no. 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)
Я не могу понять, почему это происходит. Было бы здорово, если бы кто-нибудь мог объяснить или указать какую-то ссылку на материал.
Благодаря
Я не думаю, что второй дтор будет достигнут. – MSalters
@MSalters Можете ли вы объяснить, почему? Ох, я вижу, на самом деле не разбирал код;) 'unique_ptr' дважды удалил управляемый указатель. Хотя я думаю, что второй dtor будет достигнут, но UB произойдет внутри него. – vsoftco
В первую очередь не выделяется 'new', поэтому первый dtor, вероятно, повреждает стек. – MSalters