Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Я создаю объект, в котором динамически выделяется память (безопасный массив). Так вот, без удачного выделения памяти создавать объект бессмысленно. Как в конструкторе в случае неудачного выделения отказаться от создания объекта? Есть какие- то паттерны программирования в таких ситуациях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 16:04 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Исключение кидать Код: plaintext 1. Или убрать выделение памяти из конструктора в отдельный метод и возвращать оттуда удалось выделить память или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 16:18 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Dima TИсключение кидать Код: plaintext 1. А можно в Qt в коде кидать только исключения, а где-то в одном месте все их перехватывать и по параметру понимать что произошло? Просто долго писать все эти cathc(int i). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 17:08 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
А это уже надо смотреть что ты собираешься делать если выделение памяти обломилось и объект не создался. PS: За пальцы не бойся, кожа нарастёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 17:26 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, мне надо при любых исключениях сделать одинаковый набор действий (сохранить промежуточные вычисления), а потом выйти из программы. Поэтому было бы здорово, если в теле программы я бы просто кидал "throw 3;" или "throw 4;", а в общем месте обработки исключений вызвал свою функцию для сохранения промежуточных значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 17:30 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDimitry Sibiryakov, мне надо при любых исключениях сделать одинаковый набор действий (сохранить промежуточные вычисления), а потом выйти из программы. Поэтому было бы здорово, если в теле программы я бы просто кидал "throw 3;" или "throw 4;", а в общем месте обработки исключений вызвал свою функцию для сохранения промежуточных значений. Исключение вызывает деструктор уже созданных объектов, там сохраняй. PS В остальном вопрос "как правильно" не имеет однозначного ответа, т.к. это вопрос проектирования, т.е. из категории вкуса фломастеров. PPS Меня не надо спрашивать как по-моему правильно, т.к. я за коды возврата, т.е. вторую часть моего поста 20907277 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 18:17 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Dima Tя за коды возврата Поправлюсь: я за возвращение кода ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 18:22 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLА можно в Qt в коде кидать только исключения, а где-то в одном месте все их перехватывать и по параметру понимать что произошло? Qt в принципе не работает с исключениями. Это их решение. Твой код не должен выбрасывать исключения в вызовах Qt. Т.е, например, ты не должен вылетать из слота по исключению, не должен вылетать по исключению из любого перегруженного метода Qt и т.д. Есть детали, можно установить глобальный обработчик сообщений Qt и там поставить свой catch(...), но тут я не помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 20:39 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Что по поводу исходного вопроса. В C++ отказаться от создания объекта можно только одним способом: выбросить из конструктора исключение. Но тут есть детали. Например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Как с таким бороться - отдельный вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2017, 21:12 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ создаю объект, в котором динамически выделяется память (безопасный массив). Так вот, без удачного выделения памяти создавать объект бессмысленно. Как в конструкторе в случае неудачного выделения отказаться от создания объекта? Есть какие- то паттерны программирования в таких ситуациях? бросить исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2017, 23:21 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
[quot petrav][quot Qt в принципе не работает с исключениями. Это их решение. Твой код не должен выбрасывать исключения в вызовах Qt. Т.е, например, ты не должен вылетать из слота по чего? используем напропалую исключения, и в хвост, и в гриву. все ок. вообще, современное приложение на С++ не может не использовать исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2017, 23:35 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2017, 20:46 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ создаю объект, в котором динамически выделяется память (безопасный массив). Так вот, без удачного выделения памяти создавать объект бессмысленно. Как в конструкторе в случае неудачного выделения отказаться от создания объекта? Если до выделения памяти проводилась инициализация каких-то объектов, то их надо почистить. Хотя, говорят, что само почистится , надо проверить... После этого можно бросить исключение - в этом случае(throw из конструктора) объект не считается созданным ! И ничего дополнительно удалять не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 05:39 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
MasterZilMasterZiv, http://doc.qt.io/qt-5/exceptionsafety.html#signals-and-slots я изучу вопрос похоже, это просто общие пугающие на м всякий случай слова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 08:33 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
MasterZivя изучу вопрос что удалось нарыть: - просто не вызывается деструктор. - куча, стек(сам объект) - всё это остаётся живым после выбрасывания исключения. - члены класса и родительские инстансы уничтожаются. Т.е. родительский деструктор зовётся. поэтому после исключения нужно почистить всё, что выделено. Поэтому перед выбросом лучше почистить всё изнутри конструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 09:07 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
petravQt в принципе не работает с исключениями. Это их решение. Твой код не должен выбрасывать исключения в вызовах Qt. Т.е, например, ты не должен вылетать из слота по исключению, не должен вылетать по исключению из любого перегруженного метода Qt и т.д. Есть детали, можно установить глобальный обработчик сообщений Qt и там поставить свой catch(...), но тут я не помню. Глобальный обработчик событий не прервет нить выполнения, в которой появилась проблема. Если программа однопоточная, то вообще ничего не произойдет до освобождения потока. В моем случае есть основной поток, обслуживающий рабочие потоки, но надеяться на то, что он особо быстро отработает не приходится. Где можно подробнее прочитать про все ограничения на использование исключений в Qt? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 10:15 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Просто храните все выделенное в смартуказателях, и все будет работать как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 10:19 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Сейчас в исключительно ситуации я делаю такие странные действия: Код: plaintext 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. Хочется вместо блока: Код: plaintext 1. 2. Писать просто: Код: plaintext 1. И еще вопрос: насколько уместна попытка подождать и попытаться выделить память еще раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 10:29 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
CEMbчто удалось нарыть: - просто не вызывается деструктор. Как бы про это сразу написали:Dima TИсключение вызывает деструктор уже созданных объектовОбъект становится созданным после успешного завершения работы конструктора. Поэтому это: CEMb(сам объект) - всё это остаётся живым после выбрасывания исключения.никак не может быть верным. Объект, который никогда не был создан, остаться живым не может. CEMbпоэтому после исключения нужно почистить всё, что выделено. Поэтому перед выбросом лучше почистить всё изнутри конструктора.Слишком потно. Лучше, как тут уже написали, использовать классы, которые сами за собой подчищают. Умные указатели там, вот это вот всё. CEMbчто удалось нарыть:На будущее: есть такая штука — стандарт. Очень помогает уверенно выяснить что и как должно вести себя в языке, без экспериментирования. В частности, см. http://eel.is/c draft/except.ctor#3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 11:46 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLХочется вместо блока: Код: plaintext 1. 2. Писать просто: Код: plaintext 1. Если не путаю, то этот блок равносилен Код: plaintext 1. AlekseySQLИ еще вопрос: насколько уместна попытка подождать и попытаться выделить память еще раз? Повторно можно пробовать если за время ожидания произойдет освобождение памяти. Если в параллельных потоках выделена какая-то память и ожидается что она будет вскоре освобождена, то есть смысл подождать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 11:47 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПросто храните все выделенное в смартуказателях, и все будет работать как надо. Да не надо вообще смартуказателя. Нужен массив -- возми std::vector этого типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 11:55 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
MasterZivДа не надо вообще смартуказателя. Нужен массив -- возми std::vector этого типа. Он, типа, не smart и не указатель, ага. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 13:52 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли не путаю, то этот блок равносилен [src c++] MyLib::SaveAndExit(5); Что- то я об этом не подумал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 15:24 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLСейчас в исключительно ситуации я делаю такие странные действия: Что-то тут жесть нереальная написана. Предложения/замечания: 1. Дать классу MyClass осмысленное название. 2. Если мы находимся в методе класса Foo, то для вызова методов этого класса не надо писать постоянно Foo::myMethod(). 3. Коды ошибок в int заменить на enum с говорящими названиями. 4. От terminate() отказаться. 5. Многократные попытки выделить память удалить. 6. От malloc() отказаться. Перейти на new std::uint8_t[Size](). 7. От засыпаний отказаться тем более. 8. Это вообще что-то невероятное: Код: plaintext 1. 2. 3. 4. 5. 9. Постараться перейти на std::vector, std::vector::resize и std::vector::reserve. Но вам будет сложно не спровоцировать копирование этого объекта. PS: Но самое главное, что вы собираетесь делать с промежуточными результатами вычислений? Вот что? Они сами по себе представляют ценность или вы для них запустите какую-то другую программу которой памяти почему-то хватит? PPS: Какими объемами памяти в планируете манипулировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 16:20 |
|
||
|
Как в конструкторе объекта отказаться от его создания?
|
|||
|---|---|---|---|
|
#18+
Dima TAlekseySQLИ еще вопрос: насколько уместна попытка подождать и попытаться выделить память еще раз? Повторно можно пробовать если за время ожидания произойдет освобождение памяти. Если в параллельных потоках выделена какая-то память и ожидается что она будет вскоре освобождена, то есть смысл подождать. ИМХО, нет смысла ждать в таком стиле как там написано. Если мы предполагаем освобождение памяти в другом потоке, то делать это нужно как-то по другому, более интеллектуально (может condition variable). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 16:24 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39544212&tid=2018053]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 275ms |
| total: | 463ms |

| 0 / 0 |
