Я читаю о принципе RAII
и у меня есть несколько вопросов по этому поводу. По сути, он инкапсулирует ресурс. Итак, рассмотрим класс std::string
. Он имеет конструктор string (const char* s);
. Так, например, умные указатели (например, явный шаблон shared_ptr (U* p); ) он принимает указатель на ресурс и затем управляет им. Правильно ли так говорить о string
s?
Понимание объекта RAII
Ответы (1)
подобно умным указателям (например,
shared_ptr
) он принимает указатель на ресурс и затем управляет им. Это правильно
Не совсем. shared_ptr
s принимают участие во владении объектом, на который указывает этот указатель, а unique_ptr
получает исключительное владение. Что касается интеллектуальных указателей, weak_ptr
не становится владельцем сразу, но он присоединяется в качестве наблюдателя к объекту, принадлежащему shared_ptr
s, и позволяет позже попытаться разделить владение.
Дело в том, что эти интеллектуальные указатели берут на себя ответственность за существующий объект, указанный указателем, который им дан.
std::string(const char*)
, с другой стороны, создает копию строки с нулевым завершением, на которую указывает указатель, и на которую он затем имеет исключительное право владения. Исходный текст, на который указывает аргумент указателя конструктора, не имеет постоянного отношения к созданному объекту string
; например, изменения string
не влияют на этот текст. Отдельно объект std::string
может внутренне хранить указатель на динамически выделенный буфер, в котором хранится копия текста, и этот буфер можно изменять и обновлять (в других случаях — для достаточно короткого текста — он может храниться непосредственно в объекте std::string
в качестве оптимизации). При уничтожении std::string
delete[]
будет уничтожен любой внутренний указатель, которым он все еще управляет. Они никогда не пропускают память.