Понимание объекта RAII

Я читаю о принципе RAII и у меня есть несколько вопросов по этому поводу. По сути, он инкапсулирует ресурс. Итак, рассмотрим класс std::string. Он имеет конструктор string (const char* s);. Так, например, умные указатели (например, явный шаблон shared_ptr (U* p); ) он принимает указатель на ресурс и затем управляет им. Правильно ли так говорить о strings?


person stella    schedule 01.10.2015    source источник


Ответы (1)


подобно умным указателям (например, shared_ptr) он принимает указатель на ресурс и затем управляет им. Это правильно

Не совсем. shared_ptrs принимают участие во владении объектом, на который указывает этот указатель, а unique_ptr получает исключительное владение. Что касается интеллектуальных указателей, weak_ptr не становится владельцем сразу, но он присоединяется в качестве наблюдателя к объекту, принадлежащему shared_ptrs, и позволяет позже попытаться разделить владение.

Дело в том, что эти интеллектуальные указатели берут на себя ответственность за существующий объект, указанный указателем, который им дан.

std::string(const char*), с другой стороны, создает копию строки с нулевым завершением, на которую указывает указатель, и на которую он затем имеет исключительное право владения. Исходный текст, на который указывает аргумент указателя конструктора, не имеет постоянного отношения к созданному объекту string; например, изменения string не влияют на этот текст. Отдельно объект std::string может внутренне хранить указатель на динамически выделенный буфер, в котором хранится копия текста, и этот буфер можно изменять и обновлять (в других случаях — для достаточно короткого текста — он может храниться непосредственно в объекте std::string в качестве оптимизации). При уничтожении std::string delete[] будет уничтожен любой внутренний указатель, которым он все еще управляет. Они никогда не пропускают память.

person Tony Delroy    schedule 01.10.2015