|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||||||||||
Проверка выделения памяти указателей через оператор new17.01.2015, 10:42. Показов 23500. Ответов 77
Метки нет (Все метки)
И так есть некая структура, экземпляр которой определён как:
Предполагаю что:
П.С. В дальнейшем естественно кол-во массивов и матриц будет больше 1, потому у меня сейчас сомнения того как правильно написать цикл проверки.
0
|
||||||||||||||||
| 17.01.2015, 10:42 | |
|
Ответы с готовыми решениями:
77
Вопрос по поводу динамического выделения памяти и указателей
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 18.01.2015, 00:55 | |||
|
которые могут выбросить конструкторы. И что сам по себе std::nothrow не имеет никакого отношения к чему то подобному спецификатору noexcept. Ну то есть, eсли использовать ловушку, то это превентивно 100% гарантия безопасной с точки зрения исключений работа. Потому что здесь нет человеческого фактора. Если не использовать ловушки, то вот тогда зависит от конкретных конструкторов создаваемых объектов. Но ведь получается, что использовать new(std::nothrow) имеет смысл только если точно известно, что конструкторы так же не будут кидать исключений. А обеспечить 100% гарантию что из конструкторов не полетит - невозможно. Это - исключительно ручная работа программиста. Все на его совести и усмотрении. Таким образом, сама по себе возможность использования new(std::nothrow) несколько сомнительная. Гарантий безопасности относительно исключений никаких не дает. Но без этих гарантий, само использование - не безопасно. По сути, получаем "мину замедленного действия".
0
|
|||
|
Неэпический
|
|||||||
| 18.01.2015, 01:08 | |||||||
0
|
|||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 18.01.2015, 05:31 | ||
|
1
|
||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
| 18.01.2015, 06:43 [ТС] | |
|
И самое главное, что на популярных сайтах даже не объясняется почему и в каких ситуациях может вылезти ошибка этого bad_alloc.. Вот потом спрашивается как научиться чисто программировать, если надо 7 потов излить чтоб хотя бы пресловутый New правильно использовать.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 18.01.2015, 09:01 | |||||||
0
|
|||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||
| 18.01.2015, 09:23 [ТС] | ||
|
Какие по логике могут произойти ошибки: 1. Нехватка памяти. 2. Уже выделена память для этого экземпляра, повторно естественно нельзя. А больше я даже придумать не могу... А если горе программист ленится делать проверки операций, которые он вызывает, то это лишь говорит о его не компитентности. Даже я, не особо шарющий не скуплюсь на проверки (возможно не всегда, но это лишь из за отсутсвия инфы, и как раз такой случай здесь - нет информации о причинах появления ошибок). П.С. Зря админ переместил тему в раздел для нубов, тут вполне серьёзный и сложный вопрос обсуждается, а из за того что тема в клоповнике - будут как раз заходить такие вот горе программисты, которым "в лом". (ну раз в лом, то "не умееш с*ать - не мучай жопу", если делать то правильно, а иначе зачем вообще делать)
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 18.01.2015, 09:31 | ||
|
2) Нет подключения к сети. 3) Из сети пришла какая-то фигня, которую парсер переварить не может. 4) Еще какая-то фигня, после которой можно только аварийно завершить процедуру. Я же специально написал "some_large_function" подразумевая что там сложный код запихан, а не только new. И 100500 раз прописывать код аварийного завершения в лом. Для этого компилятор есть.
0
|
||
|
Неэпический
|
|||||
| 18.01.2015, 09:42 | |||||
|
Я так понимаю, Вам просто не понятно для чего нужны исключения и как их использовать? В ином случае, уже я не понимаю, что мы тут обсуждаем.
0
|
|||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||
| 18.01.2015, 10:00 [ТС] | ||||
|
Renji, вася, тут тема про оператор New. Если тебе заняться нечем - не мешай другим, не разводи лишний балаган не по теме.
*Но ты так написал, что непонятна суть фразы, потому я ответил так же разплывчато.
0
|
||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||||
| 18.01.2015, 10:04 | ||||||||
0
|
||||||||
|
Неэпический
|
||||
| 18.01.2015, 10:16 | ||||
|
0
|
||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||
| 18.01.2015, 10:22 [ТС] | ||||
|
Вообще спорить со мной безполезно, ты намекаеш на удобство, мол "нафига мне всё это контролить, если за меня это сделает кто то другой", а я считаю что такой подход делает программистов однокнопочными "юзверами", которые из за вот такого вот угрюмого стиля\подхода совсем перейдут на шаблонный стиль. (С\С++ языки высокого уровня, не надо их превращять в огрызки) Добавлено через 5 минут
0
|
||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 18.01.2015, 10:23 | ||
|
0
|
||
|
Неэпический
|
|||||||||
| 18.01.2015, 10:31 | |||||||||
0
|
|||||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 18.01.2015, 10:37 [ТС] | |||
|
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 18.01.2015, 14:57 | ||||||||||||
|
Вам стоит понять, что исключение может бросить не только new, но и конструктор конструируемого класса, Любая функция, которая была использована внутри этого конструктора. У класса может оказаться мембер, который тоже при своем создании может бросить исключение. В этом случае оно вылетит из конструктора агрегата ещё до того, как запустится конструктор этого агрегата. Вы должны понять одну истину: Вы пишите код, которые потенциально может отработать с ошибками. Это - аксиома. Если вы думаете, что ваш код безопасен и стабилен - вы заблуждаетесь. Вы должны учитывать это, как аксиому: любой код, любая ветвь исполнения потенциально может завершится программным сбоем. Сбойный сектор на жестком диске, отказ железа, скачек напряжения в электрической розетке, или ошибки программных алгоритмов - все что угодно. Если вы пишите какую нибудь простенькую лабуду - это фигня. В худшем случае просто упадет, ну и фик бы с ней, можно просто заново перезапустить, главное что б не слишком сильно глючило. Но если вы хотите писать серьёзный отказоустойчивый софт, который должен быть безопасен (например, вспомогательные системы управления пассажирским авиалайнером) Вам стоит понять: система должна сохранять работоспособность вопреки. Вы должны суметь перехватить и обработать любые "стрессовые" ситуации. Более того, обработчик нештатных ситуаций пишится в условиях, когда изначально не известно, что за ошибка то может быть. Потому что ошибка может быть какая угодно, и всегда - неожиданная. (все известные ошибки были отловлены ещё на этапе тестирования). Для этого архитектура изначально проектируется так, что бы все узлы имели строгие гарантии безопасности. Это означает, что компонент можно откатить к некому первоначальному состоянию без потери данных: если ошибка - откатываем всю операцию назад. И пробуем заново. Ошибка редкая - второй раз может прокатить. Либо так, что бы компоненты можно было полностью перезапустить. При работе с ошибками важно выявить и обработать все известные ошибки. Но это - лишь половина дела. Но главное - сохранить жизнь приложению в условиях, когда возникают не известные, не понятно из-за чего возникающие. http://rextester.com/BQPZ66179
ЗЫ: Механизм исключений позволяет отловить любые исключения в автоматическом режиме. То есть, программисту можно не бояться, что он ничайно позабыл где-то, чего-то. Проверка возвращаемых значений: кодов, либо на NULL такой автоматики не предоставляет. Соответственно, код написанный в сишном стиле не даёт никаких гарантий стабильности. Добавлено через 30 минут зы: в приведенном выше коде используется new(std::nothrow) И создается иллюзия, якобы исключение std::bad_alloc не случится. Однако это не так: он может вылететь из конструктора:
1
|
||||||||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||
| 18.01.2015, 18:50 [ТС] | ||||||||
|
ЗЫ, классный пример у вас кода, только мальца не понятно... при catch он опять попробует try чтоль?.. и так в безконечном цикле?.. 2ЗЫ: эта конструкция try,catch,catch... мне напоминает switch с case, который на взгляд очень удобен, но на деле: 1. Его невозможно динамически применить(я идеалист, работаю только с динамикой). 2. Кажется что только на нужный case сработает (ну если его нет то в default), но на деле это тот же самый обычный цикл, который статично в порядке написания программером будет выполняться (условно от 0 до N+default[1]).. 3ЗЫ: такое ощущение что этот try можно запихнуть куда угодно и где только можно использовать, но ведь с тем же успехом я и GetLastError (я думал что это чисто Си метод, но раз мне тут сказали что он от ОСи win, то ну ладно, не суть) могу пользоваться с теми же выводами ошибок. По сути же вы решаете проблему перезапуском микро алгоритма или макро, что в принципе можно сделать даже если результат операции будет NULL, в последовательности конешно менее удобной (придётся выполнить сначало микро откат, а потом уже макро, т.е. 2 отката, даже если проблема в 2-ом случае), но принцип останется тот же, даже возможно чуть удобнее, т.к. можно самому написать алгоритм откатов и т.п.
0
|
||||||||
|
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
|
||||||||||||||
| 18.01.2015, 22:15 | ||||||||||||||
Вот пример простой. Скомпилируйте и запустите.
Не по теме: Перфокарты наше всё? Вы же язык не знаете, о каких новшествах может идти речь? И чего такого плохого в обучении? Не хотите пользоваться средствами C++? Пользуйтесь чистым C, в чем проблема-то?
0
|
||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||
| 18.01.2015, 23:07 | |||||||||||||||
Сообщение было отмечено DrOffset как решение
РешениеЕсли полетит исключение (любое, не важно откуда, не важно почему), то никакие ваши проверки на NULL уже просто не отработают. Код с ними и после них просто не выполнится. http://rextester.com/QGYKX26296
То бишь, вы используете сишную работу над ошибками. Однако, такая конструкция вовсе не гарантирует вам, что исключений действительно не будет. И из-за отсутствующих ловушек, процесс просто ляжет, как это проиллюстрированно в примере выше. Что бы этого гарантированно не произошло, нужно ставить ловушки. Но если вы ставите ловушки, то std::nothrow вам не нужен, потому что вы уже работаете с исключениями. То, о чем вы пишите называется "си с классами" в лучшем случае. Мысли аля "я не хочу использовать конструкторы/исключения/шаблоны/лямбды/etc" обычно случаются из-за банального не знания языка. И это проходит по мере его освоения. Добавлено через 5 минут Возьмите в руки любую книжку "базовый курс с++". Раздел "Обработка исключительных ситуаций". Там все написано. А это - статический язык. На с++ можно реализовать любую динамику, кроме рефлексивной. Но для этого нужно сначала понять статику. И тогда со временем придет понимание, что в основе любой динамики лежит статика. Тогда можно будет изготавливать хорошие динамические решения.
0
|
|||||||||||||||
| 18.01.2015, 23:07 | |
|
Проверка выделения памяти Проверка выделения памяти Проверка возраста через оператор switch Выделение памяти для массива через оператор new Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|