979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
1 | |
Стратегия "получение ресурса есть инициализация"14.04.2013, 11:21. Показов 3231. Ответов 29
Метки нет (Все метки)
Здорова!
Тут вообщем новую концепцию ООП вычитал "получение ресурса есть инициализация" Вообщем считается когда используешь исключения, то обязательно нужно соблюдать эту концепцию? И еще считается, что этот способ очень хороший для работы с умными указателями, но как его можно применить к умным указателям? Класс умный указатель этож как бы оболочка он токо ссылки содержит, какой там может быть ресурс, какое там освобождение, если он и так ресурсов не содержит????
0
|
14.04.2013, 11:21 | |
Ответы с готовыми решениями:
29
Получение ресурса по id Получение строки из ресурса Получение ресурса string в классах Упаковка ресурса в артефакт и получение пути Получение (чтение) html файла ресурса в проекте MFC |
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
14.04.2013, 11:23 | 2 |
Ресурс — владение указателем. Владение — это обязанность вызвать деструктор объекта, на который указывает этот указатель.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
||||||
14.04.2013, 11:27 [ТС] | 3 | |||||
А от если у меня есть такой класс который просто тупо как бы ссылки содержит, то что я должен в деструкторе вызвать?
Я вообще считаю если new вызывается тогда токо можно что то освободить вызвал delete. А в случае с классом выше как быть? Или мне нужно вызвать new обязательно? хз. как делать.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
14.04.2013, 11:39 | 4 |
А вот именно это и есть понятие владения.
Класс Ptr обладает ссылками на объекты, но не обязан их удалять. То есть он не контролирует их время жизни, не владеет ими. Он просто получил указатели на какие-то объекты, созданные ранее. Соответственно, возникает проблема: эти объекты нельзя удалить, пока они нужны Ptr. Для её решения можно поступить двумя путями: или передавать Ptr владение над этими объектами, или разделить владение между несколькими объектами. Для первого случая есть std::unique_ptr — при его передаче предыдущий владелец теряет ссылки на эти объекты, а вместе с ними и обязательство удалять объекты, тогда как Ptr всё это получает. Для второго случая есть std::shared_ptr — тогда оба объекта (и предыдущий владелец, и этот Ptr) совместно владеют одним объектом, удалять этот объект будет тот, кто останется последним.
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
14.04.2013, 11:48 [ТС] | 5 |
Не знаю даже как это от если у меня массив будет int v[200], То я просто инициализирую Ptr
Ptr b(v[0],v,200); Я ж наверно не смогу в деструкторе удалить этот объект никак, да мне даже вызывать его смысла нету (да и не зачем), ведь там же храниться будет не копия ресурсов, а ссылки на эти ресурсы, значит смысл удалять (освобождать)? В данном случае наверно нету смысла, если б копия, а это наверно пришлось бы хапать новую область памяти и туда просто перекопировать значение тогда да нужно было б высвободить память. Ну правильно ж? Скажи, что мне деструктор в классе можно и не определять? Да вообще проще считать, что деструктор это как очиститель, то есть удаляет данные токо те которые как бы загватил класс, к левым данным напимер ссылки смысла нету лезть. Так будет впринципе правильно. Да и вообще скорее всего ссылки это не ресурс, ресурс это память.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
14.04.2013, 12:21 | 6 |
Ресурсы - это не только память.
Если вы открыли файл, вам нужно его закрыть. Если вы захватили мьютекс, вам нужно будет его освободить. Если перед началом работы с каким-то объектом нужно его залочить, увеличить счетчик пользователей, вызвать еще-что-нибудь специфической, а по завершении - разлочить, уменьшить или еще что-то - то тут тоже это все лучше делать специальными объектами, которые в конструкторе выполняют "захват", а в деструкторе - "освобождение".
1
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
14.04.2013, 12:34 [ТС] | 7 |
DU, Ну правильно будет скорее всего в классе в то в котором захвачен ресурс в нем и освобождать его, в любом случае деструктор объекта раньше времени не вызовется пока этот объект используется. Да если этот объект будет использоваться в каком нибудь левом классе как бы указателем на этот объект это будет тоже считаться, что объект используется. Сразу трудно понять эту фигню.
0
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
|
26.06.2014, 19:34 | 8 |
Хотелось бы поднять тему и задать такой вопрос : RAII - это не панацея ведь ?
Например есть класс,задача которого владеть памятью. В его конструкторе есть строчка int* p = new int[x];После того как выполнилась эта строчка генерируется исключение. Получается, что деструктор класса не будет вызван,память,которая была выделена - не будет возвращена. Т.е. если объект не удалось полностью сконструировать,а один и ресурсов будет уже захвачен (в нашем случае память) , то на корректное освобождение этого ресурса надеется не стоит ?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
26.06.2014, 20:36 | 10 |
TheChosenOne, мораль - пишите такие конструкторы, которые не кидают исключений после захвата ресурса.
0
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
|
26.06.2014, 20:51 | 11 |
Croessmah, ну сам принцип RAII наталкивает меня на то,что если в конструкторе будет брошено исключение,то вся стратегия полетит...ммм... в космос
0x10, а как мне написать класс,который будет захватывать память и при этом будет корректно ее освобождать в случае если не удалось захватить весь ее объем( например мне нужна память для одного числа int и одного числа double ) ? Что делать если мне удалось получить память для int,а вот для double не хватило ?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
26.06.2014, 21:12 | 13 |
Каждая аллокация памяти - захват отдельного ресурса. Про умные указатели сказали выше.
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,283
|
||||||
26.06.2014, 23:07 | 14 | |||||
Ничего никуда не летит. Просто правильное применение предполагает последовательность. Т.е. если используешь эту идиому - использовать ее нужно везде.
2
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
|
28.06.2014, 00:41 | 17 |
Tulosba, да,я уже разобрался,спасибо
Добавлено через 1 час 16 минут А вызов деструкторов для уже созданных объектов гарантирует реализация С++ или этот вызов как-то связан с областью видимости?Т.е. что вызывает деструктор ? Добавлено через 25 минут Интересно вот что : Если было брошено исключение,но нет его обработчика,объект конструируется,но не полностью... И существует в таком виде до конца области видимости... Т.е. если объект не удалось создать полностью ,то под-объекты которые были созданы продолжают существовать (вместе с не до конца созданным объектом). Но если вдруг есть обработчик ,тогда все норм. Ощущение что механизм раскрутки стека работает только когда есть обработчик... И подобъекты уничтожаются только когда находится обработчик,а не по мере раскрутки стека... Добавлено через 30 минут Упс,ошибочка вышла,terminate() вызывается,с последним разобрался...
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,283
|
|
28.06.2014, 00:58 | 18 |
Нет. Деструкторы вызываются при выходе из области видимости. Выход любым легальным способом, в том числе через исключение.
0
|
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
|
|
28.06.2014, 01:40 | 19 |
DrOffset, Из какой области видимости выходят подобъекты ? Конструтора?Но они не являются локальными по отношению к конструктору. try блока ? Ну тогда должен вызываться деструктор всего объекта,а этого не может быть т.к. объект не был создан.
Добавлено через 9 минут Добавлено через 12 минут на SOF мне ответили что сам конструктор недоконструированного объекта вызывает деструкторы подобъектов..Может кто-нибудь скажет что-то еще на этот счет ?
0
|
18841 / 9840 / 2408
Регистрация: 30.01.2014
Сообщений: 17,283
|
|||||||||||
28.06.2014, 02:09 | 20 | ||||||||||
Не try блока, а в том числе try блока. Той области видимости, где была попытка создания объекта (try-блок, функция, scope и т.п.). Уже созданные подобъекты принадлежат этой же области видимости, что и главный объект. Вот такой же код не вызывает вопросов?
0
|
28.06.2014, 02:09 | |
28.06.2014, 02:09 | |
Помогаю со студенческими работами здесь
20
Получение Utilization отдельного ресурса (Unit) конкретного ResourcePool Найдите все такие значения К, при которых есть выигрышная стратегия Укажите такое значение S, при котором у Вани есть выигрышная стратегия Получение Модели DOM (Web ресурса), загруженной JAVA приложением на компе Найти наибольшее значение К, при котором есть выигрышная стратегия, позволяющая выиграть своим первым ходом Есть AVI в виде ресурса, как его показать в форме? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |