ответа так и не получил, задаю здесь.
Законно ли вызвать unique_ptr::reset к взятому адресу от переменной, выделенной на стеке?
твой исходный вопрос был другим, ответ на этот вопрос - да, законно. только это не вопрос для чата, а для вдумчивого чтения cppref
Я конечно не эксперт, но такой юникпоинтер будет невалидным после выхода их скоупа переменной
Как оно чудно грохнется на деструкторе, если не дать ему кастомный deleter
К сожалению явно этот вопрос ни на основной статье про юники, ни в статье по методу данный вопрос окучен не был.
тебе не статья нужна, а гарантии стандарта и описанное поведение
https://en.cppreference.com/w/cpp/memory/unique_ptr Речь ведь о данном тексте?
только вам не reset нужен, а release
@trueni сделать это тебе никто не помешает, но это будет неправильным, поскольку в деструкторе unique_ptr попытается освободить память по этому адресу и это будет неопределённым поведением. Не говоря уже о том, что такой указатель очень легко может повиснуть
Благодарю нижайше за информативный ответ по теме
ну может там делитер "стековый"
А если освобождение памяти при выходе из скоупа вызова reset как раз и требуется?
Когда ты в последний раз создавал unique_ptr с кастомным делетером и при этом не от указателя, возвращённого new[]?
зачем эти костыли?
Если это стековая переменная, то память под неё и так будет освобождена. И деструктор будет вызван, если он у типа есть
вообще new[] не использую
Где-то в этом году для файла я так делал
То есть для аналогичных случаев ты просто вектор используешь?
аналогичных чему
В смысле для сишного FILE?
Когда тебе нужен набор объектов, количество которых известно только в рантайме
я использую подходящие контейнеры
Валидно. Но как это тебя угораздило?
всё ещё не понятно зачем это
Как и всегда, бюджет на фиксы багов выделили, а на полноценный рефакторинг нет /shrug
мне кажется тут юник птр не подходит
Проблема в том, что переменная должна быть передана в виде указателя на базовый класс. Один из пользователей либы прислал баг репорт где он передал взятый от стековой переменной адрес вместо указателя. Тут вот и пришлось задумываться, как без фабрик и изменения внешних интерфейсов это дело окучить на своём уровне
адрес стевокой переменной это тоже указатель
М, сделать нужные типы данных шаблонными и прописать в требовании к типу, что он умеет разыменовываться в нужный?
Возможных для передачи типов больше трёх сотен
И вообще, если программист пихает в unique_ptr адрес стековой переменной, то он ССЗБ
Чисто технически подходит. И это было одной из причин, почему scope guards как-то не попали в стандарт
чисто технически можно вместо любого RAII использовать unique_ptr
Зависит от обстоятельств. В частности надо понимать что это возможно
Обсуждают сегодня