Вы на самом деле поставили свой реальный вопрос в комментарии:
Насколько я понимаю, unique_ptr
состоит в том, что его следует использовать, чтобы гарантировать, что у вас есть только один указатель на объект в любое время.
Нет, это неправильно.Вы можете легко сделать простое:
std::unique_ptr<int> a(new int);
int *b = a.get(); // b points to the same object as a
Дизайн unique_ptr
пытается , чтобы гарантировать, что вы можете иметь только один unique_ptr
для объекта.Но даже это может обеспечить это, только если вы не используете голые указатели.С голыми указателями легко обойти этот дизайн:
std::unique_ptr<int> a(new int);
std::unique_ptr<int> b(a.get());
Здесь b
указывает на тот же объект, что и a
, поэтому эта программа имеет неопределенное поведение (потому что объект int
будетбыть удаленным дважды).
unique_ptr
намеревается показать владение .Так как может быть только один unique_ptr
, который может указывать на объект (игнорируя «взлом», который я представил ранее), unique_ptr
владеет указанным объектом, и, поскольку вызывается деструктор unique_ptr
, он удалитостроконечный предмет.