Почему std::unique_ptr имеет функцию-член get()?

Разве std::unique_ptr не предназначен для того, чтобы быть уникальным указателем на память, и никакой другой указатель не должен указывать на эту память?

Тогда почему std:unique_ptr имеет функцию-член get(), которая возвращает необработанный указатель на память, принадлежащую std::unique_ptr?

Итак, используя get(), мы можем создать множество владельцев (необработанных указателей) на память std::unique_ptr, разве это не бессмысленно?


person user2591935    schedule 30.10.2014    source источник
comment
несырые указатели являются владельцами. Это только владелец, если вы так говорите.   -  person Mooing Duck    schedule 31.10.2014
comment
У них есть полный контроль над памятью, на которую они указывают, почему бы им не считаться владельцами?   -  person user2591935    schedule 31.10.2014
comment
Пока вы поместили указатель на выделенную вам память в std::unique_ptr (в правильной области), вы можете безопасно использовать необработанный указатель (полученный с помощью get()) во всей этой области, зная, что он будет удален в соответствующее время.   -  person Galik    schedule 31.10.2014
comment
@Galik Не может ли кто-нибудь сделать delete ptr.get() до того, как это выйдет за рамки?   -  person 0x499602D2    schedule 31.10.2014
comment
@ 0x499602D2 Кто-то МОЖЕТ это сделать. C++ позволяет людям делать вещи, которые они не должны делать во многих отношениях, так почему же эта конкретная глупость невозможна. Как объяснено в моем ответе, есть вещи, которые вы просто не можете сделать без функции get.   -  person Mats Petersson    schedule 31.10.2014
comment
@ 0x499602D2 Конечно. Но зачем кому-то это делать?   -  person Galik    schedule 31.10.2014
comment
В наши дни ИМХО в подавляющем большинстве случаев программисты на С++ не должны думать об удалении необработанных указателей. Они должны думать о том, где разместить создание интеллектуального указателя и какой интеллектуальный указатель подходит для поставленной задачи. Затем вы можете наслаждаться скоростью необработанного указателя, зная, что его время жизни находится под контролем.   -  person Galik    schedule 31.10.2014
comment
@user2591935: Если парень держит пистолет у моей головы, в этот момент он практически полностью контролирует меня. Это не значит, что он владеет мной или моими вещами. Контроль не подразумевает собственности.   -  person Mooing Duck    schedule 31.10.2014


Ответы (1)


Представьте, что вы делаете:

void process_file()
{
   const int max_size = 10000; 
   std::unique_ptr<char[]> buffer(new char[max_size]); 

   ifstream f("myfile.txt"); 

   f.read(buffer.get(), max_size); 
   ... 
   ... process buffer
   ...
}

Как бы вы это сделали без get()? unique_ptr нельзя передать istream::read как есть.

Что ж, как говорится в комментарии, вы можете сделать это, используя &*buffer, но это далеко не просто - использование buffer.get() ясно указывает читателю, что «это необработанный указатель внутри буфера.

person Mats Petersson    schedule 30.10.2014
comment
Как бы вы это сделали без get()? &*buffer - person D Drmmr; 31.10.2014
comment
Точно. Лучший ответ заключается в том, что наличие get позволяет вам дать понять, что вы извлекаете голый указатель из уникального указателя, а не требовать, чтобы люди поняли это из &* или из комментариев. - person David Schwartz; 31.10.2014