143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||||||||||
1 | ||||||||||||||||
Проверка выделения памяти указателей через оператор new17.01.2015, 10:42. Показов 20397. Ответов 77
Метки нет (Все метки)
И так есть некая структура, экземпляр которой определён как:
Предполагаю что:
П.С. В дальнейшем естественно кол-во массивов и матриц будет больше 1, потому у меня сейчас сомнения того как правильно написать цикл проверки.
0
|
17.01.2015, 10:42 | |
Ответы с готовыми решениями:
77
Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? Вопрос по поводу динамического выделения памяти и указателей Передача массива указателей в функцию для выделения памяти Ввод/вывод двумерного массива с использованием указателей и выделения памяти |
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
19.01.2015, 05:37 [ТС] | 61 |
вот и меня причислили символично в 2015 году)
Ещё на первой странице сказали что использование nothrow даст моей переменной результат NULL, теперь вы говорите что не то что не даст, а даже не дойдёт до проверки... кому верить?.. (и ещё меня бараном символично обозвали, когда сами друг другу противоречите по логике)
0
|
Неэпический
|
|||||||||||
19.01.2015, 06:06 | 62 | ||||||||||
operator new вернет nullptr. Если же память выделится, то в ход пойдут конструкторы из которых может вылететь исключение. new-expression почистит что должен и пробросит это исключение дальше - Проверка выделения памяти указателей через оператор new.
Не путайте new-expression и operator new. std::nothrow просто приведет к вызову внутри new-expression соответствующей перегруженной функции:
Вообще, всякие параметры, типа std::nothrow влияют только на выбор необходимого оператора: 5.3.4/11
ситуацию с вылетом исключения из конструктора уже обсудили. Собственно, вот основные выводы: Да никто Вас не обзывал. Плюсы не тот язык, который можно понять "налету"
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
19.01.2015, 07:14 | 63 |
Семантика оператора new разжевывается в любой книжке по С++. Этой темы вообще не должно было бы быть, но видимо чукча не читатель, чукча писатель, лол.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
19.01.2015, 07:19 [ТС] | 64 |
Я для чего делал топик? - Чтоб найти выход, вы же мне показываете то что "выхода нет" своим выводом.
Не ужели сложно написать исходя из моего примера первого поста так как будет правильно, если вообще может быть правильно, в чём я уже вообще не уверен...(из поста в пост один человек противоречит другому, заганяя меня, новичка в таких сложных тонкостях, в большее недопонимание что вообще тут происходит) Суть не в этом, а в том что вы из за своих противоречий (профессионалы ёпрст) не можете написать как надо, а сливаете всё в русло, где якобы я и виноват ещё... Я вот не понимаю, вы больше 10 лет потратили на изучение подобных вопросов, и у кого то есть правильный ответ, но никто не делится... один поёт про одно, второй про другое... а мне значит сидеть и биться головой об стену и гадать кто же тут прав, а кто нет... Добавлено через 2 минуты Ну ты же не чукча, напиши как будет правильно сделать.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
19.01.2015, 07:29 | 65 |
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
19.01.2015, 08:16 [ТС] | 66 |
Напиши правильно на С. Или ты только говорить умееш?.. Ну вот и сразу видно что ты из себя представляеш.
0
|
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
|
||||||
19.01.2015, 08:30 | 67 | |||||
Оно?
1
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
19.01.2015, 08:36 [ТС] | 68 |
Вопрос не по адресу, я как раз таки спрашиваю как надо чтоб не было ошибок... на взгляд очень красиво, но правильно или нет я не знаю..
0
|
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
|
|
19.01.2015, 08:38 | 69 |
Izual, зайдите по ссылки и сами посмотрите.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
19.01.2015, 09:33 | 70 |
0
|
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
|
|
19.01.2015, 09:54 | 71 |
Izual, с таким предвосхищением ошибок перед каждой программной инструкцией надо ставить проверку, что программа еще работает, состояние памяти, отведенной для проги не изменилось, контрольные суммы будущей операции валидны. А после операции проверять все то же самое + погоду на Марсе
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
19.01.2015, 11:10 [ТС] | 72 |
Не страшно, я платформу пишу, автоматический GetLastError будет после каждой вызванной апи функции. Если измерение погоды на марсе было бы апи функцией, то и она бы проверялась, если бы использовалась.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
19.01.2015, 12:10 | 73 |
В начале топика приводился new не вызывающий конструкторов. Вот это собственно и выход:
1) Не использовать конструкторы и функции плюющиеся исключениями. 2) Тщательно проверять что конструктор и используемые функции не будут плеваться исключениями. То есть, отказаться от минимум std::string, std::map, etc (могут выкинуть исключение "памяти мало").
0
|
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
|
|
19.01.2015, 12:32 | 74 |
Тогда от new лучше отказаться и вернуться к malloc или вообще к инструкциям ассемблера.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
19.01.2015, 12:37 [ТС] | 75 |
Так если я использую new[], и выделяю память большего размера нежели есть в наличии, то будет как раз это исключение... ну это я говорю основываясь на том что было описано выше в постах.
Как\где их все узнать?.. Теперь по примеру который показал iRomul - а если какая то другая ошибка появится?..
0
|
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
|
|
19.01.2015, 12:44 | 76 |
В защищенном режиме процессора на каждый процесс выделяется 4 Гб. Если не влазит в реальную оперативку, сбрасывается на подкачку.
Если Вам нужны приложения с возможным выходом за 4 Гб - нужно самостоятельно контроллировать сброс на диск. Если не нужны - доверьтесь new
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
19.01.2015, 12:49 | 77 |
Не будет. new работает в два этапа.
1) new выделяется память. Здесь можно проконтролировать кинет исключение или просто вернет nullptr. 2) new пинает конструктор объекта. А вот за происходящее внутри конструктора он никакой ответственности не несет. Оттуда вполне может прилететь исключение. Порыть доки на www.cplusplus.com на тему "No-throw guarantee". Если все внешние функции с No-throw guarantee, все ваши функции не содержат ни одного throw и нет источника аппаратных исключений (деление на ноль, например), то проблем быть не должно.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
19.01.2015, 13:34 | 78 |
Нужно не верить, а знать.
Для этого: 1. Я оставил ссылку на онлайн компилятор с демонстрацией кода в работе 2. Оставил рекомендацию взять в руки любой букварь для самых маленьких, раздел "работа с исключениями".
0
|
19.01.2015, 13:34 | |
19.01.2015, 13:34 | |
Помогаю со студенческими работами здесь
78
Проверка выделения памяти Проверка выделения памяти Проверка возраста через оператор switch Выделение памяти для массива через оператор new Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |