1 | |||||||||||||||||||||
Reset в unique_ptr19.02.2019, 22:35. Показов 9580. Ответов 51
Метки нет (Все метки)
Привет. Что делает эта функция?
затем во временную переменную приняли наш указатель, удаляем теперь созданный указатель... блин, зачем? Зачем здесь в обще этот T* old? нельзя просто так сделать:
на всякий случай оставляю код моего unique_ptr: Кликните здесь для просмотра всего текста
и еще- в конструкторе
0
|
19.02.2019, 22:35 | |
Ответы с готовыми решениями:
51
В чем отличие warm reset от cold reset? Непонятки с unique_ptr Инициализировать вектор unique_ptr Unique_ptr, семантика перемещения |
Комп_Оратор)
|
|
21.02.2019, 10:55 | 42 |
Добавлено через 1 минуту
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
21.02.2019, 14:09 | 45 |
Ты бы ещё на узбецком сайты полез смотреть...
Добавлено через 9 минут Да хоть так. Покажи уже код, где бросивший деструктор вызывается второй раз во время размотки стека. Если делитер unique_ptr выбрасывет исключение во время вызова внутри reset , то это приводит к неопределённому поведению. Вызову terminate не гарантирован.
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
21.02.2019, 15:30 | 47 |
Что мешает написать
noexcept(false) ?У reset в Requires написано, что делитер не должен (shall not) бросать исключения.
Сообщение от https://timsong-cpp.github.io/cppwp/n3337/unique.ptr.single.modifiers#3
reset его нет.)
Сообщение от https://timsong-cpp.github.io/cppwp/n3337/res.on.required
1
|
Комп_Оратор)
|
|
21.02.2019, 15:50 | 48 |
rat0r, все компиляторы что есть под рукой отрабатывают одноразово. Жаль что не могу вспомнить, где я читал о такого рода рекурсии... Не уж-то сам придумал? Я начинаю гордиться своим воображением!
Хм... Что же выходит? Выходит, что главная причина по которой исключение из деструктора, это зло - это тот факт, что явно он не запускается (кроме танцев после placement new) и поэтому нет способа отловить данное событие внутри самой функции перед закрытием её рабочей области? Если есть ещё какие-то (кроме - плохо и некрасиво) причины, хотелось бы их услышать. Раздел - новичковский, думаю многим будет интересно. Просто утверждения: -"Так делать нельзя", мне лично мало. Убедили. Однако связать руки человеку который пишет делетер всё едино не получится. Но допустим. Допустим каждый сам себе не злобный не буратино и никто не напишет делетер который возьмёт да и выбросит исключение. Как тогда может стать объект невалидным в вопросе ТС?
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
21.02.2019, 16:19 | 49 |
Если вопрос ТС именно про стандартный
unique_ptr::reset , то порядок присвоения и вызова делитера там такой не из-за того, что делитер может выбросить исключение.
Сообщение от https://timsong-cpp.github.io/cppwp/n3337/unique.ptr.single.modifiers#4
get_deleter() , а get_deleter()(old_p) может разрушить вызывающий его unique_ptr .
2
|
Комп_Оратор)
|
|
21.02.2019, 19:08 | 50 |
Придётся принять на веру, так как я не могу себе представить связь делитера и разрушение
unique_ptr . get_deleter() это же метод класса? Как же он может разрушить объект (delete this ? ). Очень странный побочный эффект...
0
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
21.02.2019, 19:11 | 51 |
IGPIGP, я же говорю, имеется в виду
get_deleter()(old_p) , а не get_deleter()
0
|
Комп_Оратор)
|
|
21.02.2019, 20:50 | 52 |
Я его и имел ввиду. Не понимаю как смартпойнтер и объект которым он владеет (old_p) могут быть связаны настолько, что вызов deleter'a на
old_p может завалить вызывающий объект unique_ptr . Ну то есть, это тот случай, когда я чувствую себя old_p
0
|
21.02.2019, 20:50 | |
21.02.2019, 20:50 | |
Помогаю со студенческими работами здесь
52
Unique_ptr и деструктор класса Использование std::unique_ptr QwtPlotItem и std::unique_ptr Operator[] в unique_ptr, shared_ptr Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |