|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
Стратегия "получение ресурса есть инициализация"14.04.2013, 11:21. Показов 3875. Ответов 29
Метки нет (Все метки)
Здорова!
Тут вообщем новую концепцию ООП вычитал "получение ресурса есть инициализация" Вообщем считается когда используешь исключения, то обязательно нужно соблюдать эту концепцию? И еще считается, что этот способ очень хороший для работы с умными указателями, но как его можно применить к умным указателям? Класс умный указатель этож как бы оболочка он токо ссылки содержит, какой там может быть ресурс, какое там освобождение, если он и так ресурсов не содержит????
0
|
|
| 14.04.2013, 11:21 | |
|
Ответы с готовыми решениями:
29
Получение ресурса по id Получение строки из ресурса Получение ресурса string в классах |
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
||
| 28.06.2014, 02:30 | ||
|
DrOffset,
А вот во втором случае, откуда компилятору знать что С состоит из а и b ? И второе,когда в куче создаешь объект - деструкторы вызываются тоже,хотя объект созданный при помощи new не входит в число локальных... Добавлено через 8 минут Т.е. объект созданный с помощью new не входит в область видимости try-блока (он где-то в куче). Однако когда генерируется исключение ,все его подобъекты уничтожаются.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||||||
| 28.06.2014, 02:34 | |||||||||||
|
Если брать твою фразу, то а и b по отношению к вложенной в foo class scope C, все остальное работает точно так же как в предыдущем примере. Вот я тут уточнение написал:
С динамическими объектами деструктор не вызывается никогда, если не был вызван delete. А delete - это по сути освобождение памяти и прямой вызов деструктора. Добавлено через 2 минуты
0
|
|||||||||||
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
||||||
| 28.06.2014, 02:38 | ||||||
|
DrOffset, дык я не использую unique_ptr ,а все равно для объекта созданного в куче,когда генерируется исключение в его конструкторе, вызываются деструкторы его подобъектов.
Псевдокод:
0
|
||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 28.06.2014, 04:56 | |||||||
|
TheChosenOne, в этом случае деструктор ~С все равно не вызовется. А вот деструкторы A и B вызываются при выходе из class scope, в даном случае по исключению, a и b автоматические объекты по отношению к class scope. См. мое пояснение выше.
В общем, чтобы расставить все точки над i, приведу цитату: 15.2/1
_________________ *На самом деле я встречал в IT такой же подход и к scope функций. У каждой функции есть как бы конструктор (pre function) и деструктор (post function). Но в С++ не так, в С++ функции - не объекты и поэтому такое поведение присуще только объектам классов (да это не последовательно и не очень логично, но помним про историю и про обратную совместимость с С). Добавлено через 17 минут И да, забыл добавить. Деструкторы вызываются в момент раскрутки. Будет ли этот вызов в конце каждого из участвующих scope или они пройдут разом в самом конце, при переходе к catch - зависит от реализации модели исключений в компиляторе. Поэтому говорить, что именно конструктор вызывает деструкторы уже созданных подобъектов - некорректно, на SOF ошиблись или дали неполный ответ.
1
|
|||||||
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
|||
| 28.06.2014, 19:12 | |||
|
DrOffset, единственное что мне осталось не ясно - это сlass scope. Я понимаю это как "область видимости класса". Т.е. само пространство имен создаваемое классом и соответственно даже не представляю как его можно покинуть...
Или имеется ввиду та область видимости внутри объекта,пока существует объект ? Добавлено через 1 час 0 минут После генерации исключения,поток управления возвращается в конструктор класса и вот тут происходят чудеса:вызываются деструкторы. Затем поток управления переходит в вызвавшую конструктор функцию.. Добавлено через 6 минут SOF:
Наверное просто стоит это принять как гарантию компилятора,а не пытаться вывести это из базовых правил...
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||
| 28.06.2014, 19:29 | ||||||||||||
|
А вообще сlass scope в стандарте - более широкое понятие (см. 3.3.7). Вот например такой код:
Однако, лично я не видел в стандарте каких-то конкретных указаний, что это должно происходить сразу же после выхода из конструктора. В стандарте написано только, что
А что такое handler в стандарте описано четко (15/1):
1
|
||||||||||||
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
||||||||||
| 28.06.2014, 22:47 | ||||||||||
.Добавлено через 29 минут Вот тут важно: Я отследил в отладчике весь путь потока управления. Например пусть ситуация такая: Создаем объект,в котором 2 подобъекта создаются нормально,а в конструкторе 3тьего появляется исключение.Смотрим на стек вызовов ф-й:
И значит он где-то хранит информацию какие подобъекты были уже созданы при вызове конструктора.Добавлено через 24 минуты Хах,для локальных объектов,которые полностью созданы вызов такой же. Выходит что компилятор генерирует специальный код всегда когда кидается исключение. При нормальном выходе из области видимости вызов в стеке не помечается как External. Т.е. с областью видимости это не связано,это лишь механизм исключений. Поскольку компилятор знает что нужно вызывать для всех созданных объектов в стеке деструкторы,а лишь затем делать pop() из стека что бы добраться до след. адреса возврата что бы перейти на уровень выше и так до тех пор пока не найдется handler. Добавлено через 10 минут External - это внешний код,который генерирует компилятор,а не метка для деструктора (извиняюсь за неточность) Добавлено через 11 минут Это можно все приписать к окончанию времени жизни объекта,но объект то создан не был -> его время жизни даже не начиналось. (это я про class scope leaving говорю )
1
|
||||||||||
|
|
||
| 28.06.2014, 23:05 | ||
|
У тебя другая проблема, что должен сделать деструктор объекта который действительно владеет памятью - он должен уведомить этот класс об удалении что бы тот обнулил эти указатели.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||
| 29.06.2014, 04:09 | ||||||
|
Я все-таки считаю, что правильнее тут сказать "зависит от реализации" - что скрывается за описанием стандарта в конкретном компиляторе. Как я уже говорил, в стандарте весьма небогатые пояснения что именно должно делаться и как. Общие фразы, "раскрутка стека", "области видимости", это видно из предыдущих цитат. Но зато описано внешнее поведение. Поэтому можно сделать вывод, что разработчики вольны сами выбирать как именно должен работать механизм исключений на низком уровне. Главное чтобы он соответствовал требованиям стандарта. Добавлено через 2 минуты
0
|
||||||
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
|||
| 29.06.2014, 16:13 | |||
0
|
|||
| 29.06.2014, 16:13 | |
|
Получение (чтение) html файла ресурса в проекте MFC Получение Utilization отдельного ресурса (Unit) конкретного ResourcePool Найдите все такие значения К, при которых есть выигрышная стратегия Укажите такое значение S, при котором у Вани есть выигрышная стратегия Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|