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

Reset в unique_ptr

19.02.2019, 22:35. Показов 10955. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru