Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1

Reset в unique_ptr

19.02.2019, 22:35. Показов 11338. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Что делает эта функция?
C++
1
2
3
4
5
6
void reset(T* ptr = nullptr) 
    {
        T* old = m_ptr;
        m_ptr = ptr;
        delete old;
    }
мы приняли "зануленый" указатель,
затем во временную переменную приняли наш указатель,
удаляем теперь созданный указатель... блин, зачем? Зачем здесь в обще этот T* old? нельзя просто так сделать:
C++
1
2
delete m_ptr;
m_ptr = ptr;
??
на всякий случай оставляю код моего unique_ptr:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
template<typename T>
class Unique_Ptr
{
public:
    explicit Unique_Ptr(T* ptr = nullptr) noexcept
        : m_ptr(ptr)
    {}
 
    ~Unique_Ptr()
    {
        delete m_ptr;
    }
 
    Unique_Ptr(const Unique_Ptr&) = delete;
    Unique_Ptr& operator = (const Unique_Ptr&) = delete;
 
    Unique_Ptr(Unique_Ptr&& ob)
    {
        m_ptr = ob.m_ptr;
        ob.m_ptr = nullptr;
    }
    Unique_Ptr& operator = (Unique_Ptr&& ob)  
    {
        if (&ob != this)
        {
            swap(ob);
            return*this;
        }
        return*this;
    }
 
    T* operator ->() const { return m_ptr; }
    T& operator *() const { return *m_ptr; }
    T* get()        const { return m_ptr; }
    explicit operator bool() {
        return m_ptr;
    }
 
    T* release() 
    {
        T* ans = m_ptr;
        m_ptr = nullptr;
        return ans;
    }
 
    void reset(T* ptr = nullptr) 
    {
        T* old = m_ptr;
        m_ptr = ptr;
        delete old;
    }
 
    void swap(Unique_Ptr& ob) 
    {
        T* temp{std::move(ob)};
        ob = std::move(ob.m_ptr);
        ob.m_ptr = temp;
    }
 
private:
    T* m_ptr;
};

и еще- в конструкторе
C++
1
2
3
4
5
Unique_Ptr(Unique_Ptr&& ob)
    {
        m_ptr = ob.m_ptr;
        ob.m_ptr = nullptr;
    }
нужно делать проверку на самоприсваивание( if (&ob != this) )?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2019, 22:35
Ответы с готовыми решениями:

В чем отличие warm reset от cold reset?
Вроде я так понял что при warm reset не сбрасывается память......а смысл? программа (или операционка) грузится заново...и то что осталось в...

Непонятки с unique_ptr
Объясните плиз кто знает, почему вот такая строка не вызывает исключения: unique_ptr&lt;char&gt; sptr {new char {&quot;Stroka&quot;}}; ...

Инициализировать вектор unique_ptr
Как инициализировать вектор unique_ptr? std::unique_ptr&lt;int&gt; a(nullptr); std::unique_ptr&lt;int&gt; b(nullptr); ...

51
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.02.2019, 10:51
Студворк — интернет-сервис помощи студентам

Не по теме:

IGPIGP,кто тебя обидел?

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 10:55

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
по мне, так это делается снизу вверх
Вы->вы->ты
это сверху вниз. Хотите вверх (Вы) ?



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
IGPIGP,кто тебя обидел?
школьный прием из дешёвых. Ещё один и я с вами не общаюсь.

0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.02.2019, 11:00

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Ещё один и я с вами не общаюсь.
да пожалуйста, я все равно тебя не понимаю. ты сам как школьник, в мрачных тонах, с таким настроением мог бы воздержаться от дискуссий

0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
21.02.2019, 11:02  [ТС]
хватит ссориться, давайте драться! (с)
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 14:09
Цитата Сообщение от Джон Кофи Посмотреть сообщение
а тут нет такой информации...
https://ru
Ты бы ещё на узбецком сайты полез смотреть...

Добавлено через 9 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
там речь шла о временах когда деструктора не были noexept по умолчанию
Да хоть так. Покажи уже код, где бросивший деструктор вызывается второй раз во время размотки стека.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Иначе вызов terminate() должен нивелировать данные соображения
Если делитер unique_ptr выбрасывет исключение во время вызова внутри reset, то это приводит к неопределённому поведению. Вызову terminate не гарантирован.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 14:51
Цитата Сообщение от rat0r Посмотреть сообщение
Покажи уже код, где бросивший деструктор вызывается второй раз во время размотки стека.
У меня нет компилятора где деструктор не noexept. Сегодня вызовется terminate().
Цитата Сообщение от rat0r Посмотреть сообщение
Если делитер unique_ptr выбрасывет исключение во время вызова внутри reset, то это приводит к неопределённому поведению. Вызову terminate не гарантирован.
Это новость. Можете доказать?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 15:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
У меня нет компилятора где деструктор не noexept.
Что мешает написать noexcept(false)?
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это новость. Можете доказать?
У reset в Requires написано, что делитер не должен (shall not) бросать исключения.
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n3337/unique.ptr.single.modifiers#3
Requires: The expression get_deleter()(get()) shall be well formed, shall have well-defined behavior, and shall not throw exceptions.
Нарушение требований, перечисленных в Requires приводит к неопределённому поведению (если нет параграфа Throws, а у reset его нет.)
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n3337/res.on.required
Violation of the preconditions specified in a function's Requires: paragraph results in undefined behavior unless the function's Throws: paragraph specifies throwing an exception when the precondition is violated.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 15:50
Цитата Сообщение от rat0r Посмотреть сообщение
Что мешает написать noexcept(false)?
rat0r, все компиляторы что есть под рукой отрабатывают одноразово. Жаль что не могу вспомнить, где я читал о такого рода рекурсии... Не уж-то сам придумал? Я начинаю гордиться своим воображением!
Хм... Что же выходит? Выходит, что главная причина по которой исключение из деструктора, это зло - это тот факт, что явно он не запускается (кроме танцев после placement new) и поэтому нет способа отловить данное событие внутри самой функции перед закрытием её рабочей области?
Если есть ещё какие-то (кроме - плохо и некрасиво) причины, хотелось бы их услышать. Раздел - новичковский, думаю многим будет интересно. Просто утверждения: -"Так делать нельзя", мне лично мало.
Цитата Сообщение от rat0r Посмотреть сообщение
Нарушение требований, перечисленных в Requires приводит к неопределённому поведению (если нет параграфа Throws, а у reset его нет.)
Убедили. Однако связать руки человеку который пишет делетер всё едино не получится.
Но допустим. Допустим каждый сам себе не злобный не буратино и никто не напишет делетер который возьмёт да и выбросит исключение. Как тогда может стать объект невалидным в вопросе ТС?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 16:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как тогда может стать объект невалидным в вопросе ТС?
Если вопрос ТС именно про стандартный unique_ptr::reset, то порядок присвоения и вызова делитера там такой не из-за того, что делитер может выбросить исключение.
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n3337/unique.ptr.single.modifiers#4
Effects: assigns p to the stored pointer, and then if the old value of the stored pointer, old_p, was not equal to nullptr, calls get_deleter()(old_p). [ Note: The order of these operations is significant because the call to get_deleter() may destroy *this. — end note ]
Я так понимаю, написано не совсем аккуратно. Не get_deleter(), а get_deleter()(old_p) может разрушить вызывающий его unique_ptr.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 19:08
Цитата Сообщение от rat0r Посмотреть сообщение
может разрушить вызывающий его unique_ptr.
Придётся принять на веру, так как я не могу себе представить связь делитера и разрушение unique_ptr. get_deleter() это же метод класса? Как же он может разрушить объект (delete this ? ). Очень странный побочный эффект...
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 19:11
IGPIGP, я же говорю, имеется в виду get_deleter()(old_p), а не get_deleter()
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 20:50
Цитата Сообщение от rat0r Посмотреть сообщение
IGPIGP, я же говорю, имеется в виду get_deleter()(old_p), а не get_deleter()
Я его и имел ввиду. Не понимаю как смартпойнтер и объект которым он владеет (old_p) могут быть связаны настолько, что вызов deleter'a на old_p может завалить вызывающий объект unique_ptr. Ну то есть, это тот случай, когда я чувствую себя old_p
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2019, 20:50

Unique_ptr, семантика перемещения
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;memory&gt; #include &lt;cstdlib&gt; using namespace std; void f(unique_ptr&lt;int&gt;&amp;&amp;...

Unique_ptr и деструктор класса
Пример простого класса: //.h class TMyClass { public: TMyClass(); ~TMyClass(); private: LRESULT CALLBACK myWndProc(HWND...

Использование std::unique_ptr
Есть в коде подобная конструкция, вылетает исключение на этапе очистки памяти. С чем это может быть связано? template &lt;typename T&gt;...

QwtPlotItem и std::unique_ptr
У меня есть вектор указателей на QwtPlotCurve. std::vector&lt;QwtPlotCurve*&gt; curves; Такой код приводит к крешу во время выполнения: ...

Operator[] в unique_ptr, shared_ptr
Привет. У меня в main-е создается двумерный массив char **array; который я передаю во множество различных функций - func(char**&amp;). Во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru