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

Reset в unique_ptr

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

Author24 — интернет-сервис помощи студентам
Привет. Что делает эта функция?
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2019, 22:35
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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

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

Не по теме:

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



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

Не по теме:

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

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

Не по теме:

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

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

Добавлено через 9 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
там речь шла о временах когда деструктора не были noexept по умолчанию
Да хоть так. Покажи уже код, где бросивший деструктор вызывается второй раз во время размотки стека.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Иначе вызов terminate() должен нивелировать данные соображения
Если делитер unique_ptr выбрасывет исключение во время вызова внутри reset, то это приводит к неопределённому поведению. Вызову terminate не гарантирован.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 14:51 46
Цитата Сообщение от rat0r Посмотреть сообщение
Покажи уже код, где бросивший деструктор вызывается второй раз во время размотки стека.
У меня нет компилятора где деструктор не noexept. Сегодня вызовется terminate().
Цитата Сообщение от rat0r Посмотреть сообщение
Если делитер unique_ptr выбрасывет исключение во время вызова внутри reset, то это приводит к неопределённому поведению. Вызову terminate не гарантирован.
Это новость. Можете доказать?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 15:30 47
Цитата Сообщение от 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
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 15:50 48
Цитата Сообщение от rat0r Посмотреть сообщение
Что мешает написать noexcept(false)?
rat0r, все компиляторы что есть под рукой отрабатывают одноразово. Жаль что не могу вспомнить, где я читал о такого рода рекурсии... Не уж-то сам придумал? Я начинаю гордиться своим воображением!
Хм... Что же выходит? Выходит, что главная причина по которой исключение из деструктора, это зло - это тот факт, что явно он не запускается (кроме танцев после placement new) и поэтому нет способа отловить данное событие внутри самой функции перед закрытием её рабочей области?
Если есть ещё какие-то (кроме - плохо и некрасиво) причины, хотелось бы их услышать. Раздел - новичковский, думаю многим будет интересно. Просто утверждения: -"Так делать нельзя", мне лично мало.
Цитата Сообщение от rat0r Посмотреть сообщение
Нарушение требований, перечисленных в Requires приводит к неопределённому поведению (если нет параграфа Throws, а у reset его нет.)
Убедили. Однако связать руки человеку который пишет делетер всё едино не получится.
Но допустим. Допустим каждый сам себе не злобный не буратино и никто не напишет делетер который возьмёт да и выбросит исключение. Как тогда может стать объект невалидным в вопросе ТС?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 16:19 49
Цитата Сообщение от 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
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 19:08 50
Цитата Сообщение от rat0r Посмотреть сообщение
может разрушить вызывающий его unique_ptr.
Придётся принять на веру, так как я не могу себе представить связь делитера и разрушение 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
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 20:50 52
Цитата Сообщение от rat0r Посмотреть сообщение
IGPIGP, я же говорю, имеется в виду get_deleter()(old_p), а не get_deleter()
Я его и имел ввиду. Не понимаю как смартпойнтер и объект которым он владеет (old_p) могут быть связаны настолько, что вызов deleter'a на old_p может завалить вызывающий объект unique_ptr. Ну то есть, это тот случай, когда я чувствую себя old_p
0
21.02.2019, 20:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2019, 20:50
Помогаю со студенческими работами здесь

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

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

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

Operator[] в unique_ptr, shared_ptr
Привет. У меня в main-е создается двумерный массив char **array; который я передаю во множество...


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru