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

Reset в unique_ptr

19.02.2019, 22:35. Показов 10959. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
20.02.2019, 12:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Джон Кофи Посмотреть сообщение
"Исключение, покинувшее деструктор во время раскрутки стека или у глобального/статического объекта, приведет к вызову terminate."
Да, но в этом случае деструктор как раз вызывается у нелокального объекта (с динамическим размещением) и никакого terminate в noexcept(false)-деструкторе в случае генерации исключения в reset не будет.

Добавлено через 5 минут
Никто не спорит, что это плохой и небезопасный код, который позволяет исключениям покидать деструкторы, но он возможен и при некоторых усилиях его можно сделать корректным. А строгая гарантия - есть строгая гарантия. Разрабоотчики std стараются обеспечивать ее везде, где это возможно. Если какой-то странный человек захочет кидать исключения из деструкторов динамических объектов, то стандартная библиотека не будет давать поводов думать, что в ней ошибка. Если и будут какие-то ошибки в этих случаях, то только в коде этого странного человека. Поэтому reset в std::unique_ptr такой.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.02.2019, 13:26
Цитата Сообщение от _stanislav Посмотреть сообщение
DrOffset, где то читал, что при уничтожении объектов исключений быть не должно, т.е. исключения должны приводить к аварийной остановке, вроде, или что то путаю?
Всё так, если "уничтожение" это о деструкторе (правильном). Но в данном случае может быть кастомный метод - делетер. То есть, ситуация может быть другой.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.02.2019, 19:56
Цитата Сообщение от DrOffset Посмотреть сообщение
Поробуйте заменить здесь reset на реализацию, которую предлагал ТС, и посмотрите на спецэффекты.
один умный мужик сказал, что нет идеального способа обработать исключения вызванных в деструкторе, кроме как "проглотить" исключение, если это допустимо, либо вывести вызов функции способную вызвать исключение из деструктора в клиентский код, этот мужик прав или есть идеальный способ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
20.02.2019, 21:03
Цитата Сообщение от _stanislav Посмотреть сообщение
или есть идеальный способ?
Универсального точно нет.
Хороший код не должен допускать выхода исключений за границы деструкторов.
А если операции освобождения ресурсов не могут обойтись без этого (иногда такое бывает), то лучше выполнять их не в деструкторе.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.02.2019, 21:05
Цитата Сообщение от DrOffset Посмотреть сообщение
то лучше выполнять их не в деструкторе.
умный мужик был прав.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 01:52
Цитата Сообщение от _stanislav Посмотреть сообщение
умный мужик был прав
Это нормально. Как я помню, выброс исключения из деструктора противоречил механизму стека С++. То есть, если деструктор объекта на стеке выбросил исключение, то объект уничтожить не удалось. Однако исключение вынуждает принудительное схлопывание области (раскруткой называют, почему-то, хотя больше похоже на схлопывание). А перед закрытием области механизм стека пытается запустить деструктора всех неубитых объектов и рано или поздно дойдёт очередь до того кто бросил исключение. А поскольку, он скорее всего имел вескую причину, которая ни куда не делась, то он бросит опять. Это рекурсия. Потом кучка умных мужиков решила стандартизировать noexcept поведение для деструкторов по умолчанию. Это значит, что кто бы внутри деструктора не выбросил исключение (и оно не перехвачено внутри), будет вызван terminate(). А в случае с 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
#include <iostream>
#include <memory>
 
using namespace std;
 
void Del(int*){}//что бы delete не был вызван :)
 
void returnFromTheBattle()
{
    int *pi = new int(123);
    //проверка на самоприсваивание, конечно - трата времени, но без неё можно отловить рантайм каку
    unique_ptr<int, void (*)(int*)>up(pi, Del);//перетащите коммент с нижней строки сюда
    //auto up = unique_ptr<int>(pi);//вот отсюдова вверх :D
    up.reset(pi);
 
}
 
int main(int argc, char **argv)
{
returnFromTheBattle();
cout<<"Return when auto up = unique_ptr<int>(pi); is rammed"<<endl;
 
cin.get();
return 0;
}
самоприсваивание - фигурально выражаясь. Самоуничтожение будет правильнее.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
21.02.2019, 04:21
Цитата Сообщение от IGPIGP Посмотреть сообщение
А перед закрытием области механизм стека пытается запустить деструктора всех неубитых объектов и рано или поздно дойдёт очередь до того кто бросил исключение. А поскольку, он скорее всего имел вескую причину, которая ни куда не делась, то он бросит опять.

Посмотрел бы в пример в https://timsong-cpp.github.io/... ept.ctor#2 сначала ну или на худой конец в какой-нибудь реализации проверил, прежде чем подобный бред нести.

Добавлено через 12 минут
Цитата Сообщение от Джон Кофи Посмотреть сообщение
интересная функция, емае. На собеседовании будут досканально спрашивать с++11
Если вопрос про reset для unique_ptr из C++11, то он noexcept.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.02.2019, 04:57

Не по теме:

Цитата Сообщение от rat0r Посмотреть сообщение
подобный бред нести.
ты опять в минуса захотел?

0
21.02.2019, 05:46

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
ты опять в минуса захотел?
Правду рубает. :)

0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
21.02.2019, 09:05  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
то он noexcept.
а тут нет такой информации...
https://ru.cppreference.com/w/... _ptr/reset
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
21.02.2019, 09:13
Джон Кофи, из N4618:
C++
1
2
3
4
// 20.11.1.2.5, modifiers
pointer release() noexcept;
void reset(pointer p = pointer()) noexcept;
void swap(unique_ptr& u) noexcept;
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
21.02.2019, 09:23
Джон Кофи,
Тот же сайт, но английская версия))
https://en.cppreference.com/w/... _ptr/reset
0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
21.02.2019, 09:49  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
Тот же сайт, но английская версия))
беда... учтем)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 10:15
Цитата Сообщение от _stanislav Посмотреть сообщение
ты опять в минуса захотел?
Я не буду отвечать данному господину, а вам скажу. _stanislav, там речь шла о временах когда деструктора не были noexept по умолчанию. И о том как они ими стали. И это было к тому, что делетер не может быть noexept по умолчанию, потому, что делетер не является конструкцией языка. Это может быть какая-то свободная функция и делать ли её noexept решает программист. И поэтому объект мог бы остаться в невалидном состоянии. Я так понимаю. Иначе вызов terminate() должен нивелировать данные соображения и данный в теме ответ не верен. Я с удовольствием послушаю соображения людей которые не бредят бредом о бреде.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.02.2019, 10:34

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
а вам скажу
попрошу мне не выкать



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

Не по теме:

бесит это клише

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.02.2019, 10:38
Цитата Сообщение от _stanislav Посмотреть сообщение
попрошу мне не выкать
Это не выйдет. Существует иерархия средств обращения в которой каждый волен выбирать то, что удобно ему. Если это делается сверху вниз то претензии беспочвенны. Впрочем, возможно вы просите обращаться на Вы? Если это так, я подумаю, как дальше быть.
_stanislav, если вы найдёте хоть один минус, выданный мной кому-либо. Я буду в шоке.

Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
бесит это клише
Правила обычной вежливости это проще стандарта С++. Утомляют законы каллиграфии?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.02.2019, 10:45

Не по теме:

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



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

Не по теме:

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

0
 Аватар для Джон Кофи
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
21.02.2019, 10:46  [ТС]
вы, по-моему, уже в другие материи ушли.
1
21.02.2019, 10:47

Не по теме:

Цитата Сообщение от Джон Кофи Посмотреть сообщение
вы, по-моему, уже в другие материи ушли.
бывает, модератор удалит, не переживай

0
21.02.2019, 10:50

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
консерватизм утомляет
Правила консервативны. Не гадить на газонах это консервативно, но нет другого средства заставить истинных революционеров ходить в туалет. _stanislav, если вас утомляет мой стиль - игнорьте мои посты. Я буду взаимен. Больше вариантов не вижу.
Я мог бы перечислить тех к кому могу себе позволить обращаться на ты. В принципе, это возможно по отношению к любому, к кому это возможно с моей и его точки зрения. Остальное решает время. Давайте прекратим данный диалог.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2019, 10: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;). Во...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru