Защо 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
Тези дни IMHO по-голямата част от времето C++ програмистите не трябва да мислят от гледна точка на изтриване на необработени указатели. Те трябва да обмислят къде да разположат създаването на интелигентния показалец и кой интелигентен показалец е подходящ за задачата. След това можете безопасно да се наслаждавате на скоростта на необработения указател, като знаете, че животът му се управлява.   -  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