C ++ primer 5 edition: shared_ptr инициализируется из uniqe_ptr? - PullRequest
3 голосов
/ 27 октября 2019

На C ++ учебник для начинающих 5 издание. Глава 12. Динамическая память: написано:

shared_ptr p (u);Р приобретает право собственности от uniqe_ptr u;делает u ноль. shared_ptr p (q, d) Предполагает владение объектом, на который указывает встроенный указатель q. q должно быть конвертировано в T* ($ 4.11.2, с.161). p будет использовать вызываемый объект d ($ 10.3.2, p.388) вместо delete для освобождения q.

  • Я не понял "Предполагается владение от unque_ptr и для объекта, к которому встроен ... ".

Может кто-нибудь объяснить мне этот абзац? Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 27 октября 2019

Книга непонятна с типами. вам нужно rvalue ref для construct a shared_ptr из unique_ptr:

template< class Y, class Deleter >
shared_ptr( std::unique_ptr<Y,Deleter>&& r );

проверьте этот код:

unique_ptr<int> up{new int{10}};
shared_ptr<int> sp(move(up));
cout << *sp <<'\n';
//cout << *up <<'\n'; // up is nullptr

Live ob Godbolt


умные указатели управляют временем жизни необработанного указателя, которым они владеют. unique_ptr не разделяет права собственности, в то время как shared_ptr делает. Когда вы создаете shared_ptr из unique_ptr, вы должны отказаться от его владения путем перемещения, и unique_ptr не может быть скопировано.

Я думаю, что используя «предполагает владение», автор хочет заявить, чтоплохие вещи все еще могут случиться, если вы каким-либо образом измените указатель, принадлежащий интеллектуальным указателям.

2 голосов
/ 27 октября 2019

Умные указатели «владеют» (или, возможно, лучше «управляют») базовым необработанным указателем или объектом.

unique_ptr владеет указателем напрямую и удаляет его, когда он выходит из области видимости. shared_ptr потенциально может делиться правами собственности с другими shared_ptr с, и управляемый объект будет удален, когда последний shared_ptr выйдет из области видимости.

Итак, в вашем примере недавно созданный shared_ptr получаетза владение от unique_ptr, оставляя последнему ничего не владеющего.

...