2016-01-01 2 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 снова возвращается к исполнению строки 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) 

Я не могу понять, почему это происходит. Было бы здорово, если бы кто-нибудь мог объяснить или указать какую-то ссылку на материал.

Благодаря

ответ

1

Технически говоря, программа может вести себя как можно мыслимы, включая печать «Неопределенное поведение», потому что это то, что у вас есть.

Я бы предположил, что это dtor c работает.

0

Те, вероятно, деструкторов в unique_ptr выполняется. Деструкторы выполняются в обратном порядке конструкции, в конце области (в вашем случае, в конце main()).

EDIT Ваш код является ярким примером того, как не использовать смарт-указатели. Пожалуйста, прочитайте комментарии ниже, а также @MSalters' answer.

+0

Я не думаю, что второй дтор будет достигнут. – MSalters

+0

@MSalters Можете ли вы объяснить, почему? Ох, я вижу, на самом деле не разбирал код;) 'unique_ptr' дважды удалил управляемый указатель. Хотя я думаю, что второй dtor будет достигнут, но UB произойдет внутри него. – vsoftco

+0

В первую очередь не выделяется 'new', поэтому первый dtor, вероятно, повреждает стек. – MSalters

Смежные вопросы