случае авто?
ну да
Да, в том, что unique_ptr управляет динамическим ресурсом память
Так, а вот объект MyClass же владеет каким-то там ресурсом res (пусть это файлом будет), и он же в динамической памяти. Или это уже не RAII?
Тоже raii, но выделенный в хипе myclass под управлением unique_ptr
Но... Тогда почему они динамическими-то быть не должны? я этого понять не могу.
Речь о голых указателях, которые не поместили под управление скопгарда, в этом случае нет объекта, который вернет системе этот ресурс при выходе из скопа или при выбросе исключения
Ну должна быть выстроена цепочка владения, причём незамкнутая, объектов по RAII владеющими друг другом, в конце которой должен находится объект в автоматической памяти (переменная класса памяти auto)
Ты вообще сознаёшь, что в объектной модели С++ объекты одного и того же класса могут размещаться в памяти любого класса, глобальной, авто, динамической? Класс не может этим управлять, он не знает, где создадут его объект. Поэтому класс-протектор по RAII только строит механизм защиты, а уж применять его должен клиент этого класса, кто пишет код.
Правило: Используйте идиому программирования RAII и не выделяйте объекты вашего класса динамически. Но же, блин, ровно динамически и выделяю в рамках RAII с юник-птром... Ладно, я тупой. я вряд ли пойму это правило.
auto ptr = std::make_unique<MyClass>(res); Где тут динамическое выделение ?
Внутри make_unique
Блин, ну сорян. Кто-то сразу въезжает, а кто-то я.
Ну, ок. соответственно, пользователь должен выстроить эту выше описанную мной цепочку владения по RAII с корнем в каком-то объекте в автоматической или глобальной памяти.
Так кого еэто ебёт?
Меня, очевидно.
С этим я не спорил нигде
В том и дело, что оно ГАРАНТИРОВАНО выделяет ресурс и тут же УПАКОВЫВАЕТ его в обёрточку, чтобы не сломать, и ГАРАНТИРОВАНО, ВСЕГДА удалить.
Но память же динамическая.. Блин, мне кажется, вы мне уже треснуть хотите, если честно
resource acquisition is initialization
Разве выделение прям гарантировано? А если бед алокейт выбросит.
Да, я помню, мы как раз об этом говорим.
Именно, а если выбросит, то всё, что выделилось, освободится, а что не выделилось - нет.
Это деталь реализации, которая тебе не должна быть интересна в рамках вопроса. В этом смысл абстракций/инкапсуляции/интерфейсов Я попробую в очень кривую аналогию, так что не ругайтесь: asm-инструкции обычно не принято встраивать в C++-код, что вовсе не значит, что результат компиляции программы не должен превратиться в бинарный исполняемый файл, представимый как asm. Так вот, make_unique – такая же абстракция над динамическим выделением памяти, как и C++ над asm Рассуждая о конкретном слое абстракции, не стоит лезть на другие её уровни
Обсуждают сегодня