Заблокирован
|
|
1 | |
Поведение оператора new платфоромозависимое?19.09.2014, 11:04. Показов 2811. Ответов 59
Метки нет (Все метки)
В случае неудачи оператора new, допустим out of memory, он может кинуть исключение или вернуть ноль:
MSDN:
0
|
19.09.2014, 11:04 | |
Ответы с готовыми решениями:
59
Не понятное поведение тернарного оператора Неправильное поведение программы с использованием логического оператора или Поясните поведение оператора == Необычное поведение оператора инкремента |
Заблокирован
|
|
19.09.2014, 15:48 [ТС] | 41 |
И тут на сцену выходит геморой отлавливания инфы, откуда, с какой строчки кода, в какой процедуре, из какого объекта и тд это исключение дропнулось ... Инфа нужна для лога и для необходимых действий
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
19.09.2014, 16:11 | 42 |
Так ото ж. NULL - это сугубо сишный причендал, и в C++ не используется. Для обозначения нулевого указателя раньше использовался 0, теперь nullptr.
1
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
19.09.2014, 16:17 | 44 |
Ну, это только теми, кто Страуструпа не читал или не уважает. Ибо старичок очень не рекомендует.
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
19.09.2014, 16:27 | 46 |
Старичок Страуструп, конечно же, человек заслуженный.... Но все же для меня истина в последней инстанции - это текст Стандарта. Ага, 18.2 в последней редакции, или же 18.1 в предыдущей.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
19.09.2014, 16:38 | 47 |
Заглянувши в Дьюхерста, увидел там следующее:
"Тем не менее, настоящие программисты на C++ по-прежнему представляют нулевой указатель литералом 0. Применяя любой другой способ, вы рискуете показаться безнадежно старомодным."
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|||||||||||||||||||||
19.09.2014, 20:52 | 49 | ||||||||||||||||||||
Ага. Там как раз есть интересная сноска:
в 18.3.2.2 18.6.1.1 Стандартом гарантируется, что компилятор знает как преобразовать 0 в правильный null pointer, этого достаточно, чтобы без опаски использовать его (0). Так что слова Страуструпа ни в коем случае не расходятся со стандартом и с реальным положением вещей. PS. Да, я работал с платформами, где null pointer имеет не равное числовому нулю битовое представление, и в С++ ноль приведенный к указателю принимал правильное значение. Все вышесказанное относится к С++. В С действительно нужен NULL. В заключение приведу кусочек GNU libio.h
nullptr позволяет типизировать null pointer, в С++03 и С++98 использование нуля вот в таком
А уже вот в таком примере мы бы получили ошибку компиляции:
0
|
Заблокирован
|
|
20.09.2014, 06:27 [ТС] | 50 |
Честно говоря, я не не первый день знаком с С++ , но никогда не любил перегруженных функций и шаблонные классы ( template class и т.д.), нет, конечно STL то я уважаю, но этого и хватает. Хотя теперь мне и Qt хватает и ни на что другое я вряд ли пересяду, хотя всегда считал WinAPI наиболее качественным и профессиональным средством разработки, правда чисто под windows. Ну это я всё к тому, что мне всякие там выборы компилятором перегруженных функций, когда передаёшь туда ноль, как то по барабану. И можете даже не смеяться по поводу моего не желания использовать перегруженные функции (конечно же иногда я их использую), программирование - такая штука, где можно лет 50 чему то учится, а потом придёт пацан и скажет, что ты всё делаешь не правильно но ты уже ничего не будешь менять и скажешь ему "я слишком стар, чтоб что - то менять, я так уже привык" .
вообще nullptr я с выходом C++11 сразу стал везде задействовать, может это связанно с тем, что на Qt я перешёл уже во времена C++11, до этого всё время программировал в WinApi, а там был всегда NULL (по этому я и думал, что он оттуда). Тут то я спрашивал про nullptr_t - который по моему мнению вряд ли где - то находит серьёзное применение , нет ну правда, это же тип нуля, а какой в нём только - то ? Ну вот просто пример void Hello(std::nullptr_t);, ну и что? Накой хрен писать процедуру, которая может принимать параметр только ноль? Я проще напишу void Hello(int a); и буду проверять его на ноль
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||
20.09.2014, 12:24 | 51 | ||||||||||
Введение типа std::nullptr_t нужно для того, чтобы при наличии таких перегрузок:
Достигается это тем, что тип nullptr_t (когда передается объект nullptr) может быть неявно преобразован в любой указатель, но не в целое.
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
20.09.2014, 12:46 | 52 |
Весь этот пассаж есть следствие того, что ты не понял, о чем я говорил. Вот Tulosba еще раз обозначил эту мысль (спасибо ему). Других веских причин для введения nullptr с собственным типом - нет. Все мои примеры с перегрузками были иллюстрацией этой проблемы (проблемы нетипизированного нулевого указателя), никаких других смыслов в эти примеры я не вкладывал.
И поверь, мне абсолютно по барабану используешь ты перегруженные функции или нет
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|||||||||||||||||||||||||||||||
20.09.2014, 14:32 | 53 | ||||||||||||||||||||||||||||||
Ну как это нет? Вот еще два:
1)
2) Вывод типов шаблонов работает неверно для 0 и для NULL. Выводится, ну например, int. А для nullptr верно - выводится nullptr_t. Например. Я хочу написать функцию, которая вначале что-то лочит, а потом вызывает другую функцию, передавая ей указатель на данные. Будет это выглядеть как-то так:
В то же время со следующим вызовом все окей:
2
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
20.09.2014, 14:56 | 54 |
Я сейчас выражу свое собственное мнение. Auto чрезвычайно вредная вещь в неопытных руках и использовать ее надо с большой осторожностью. В частности, ИМХО, вот этот пример, с возвратом указателя замаскированным auto - пример неудачного использования. Хотя с сутью я согласен, показать что производится сравнение именно с указателем - хороший case.
Вообще же, ты слишком буквально понял мой пост, все твои примеры, собственно, того же разлива, что и и мои примеры в перегрузкой (я просто не стал это разжевывать - выходит зря). Все это в итоге достигается введением конверсии из nullptr_t -> some ptr type, вместо прежней int -> some ptr type. Все примеры (и твои и мои) - это лишь демонстрация этого эффекта и показывают, суть, эту конверсию. Именно это я и имел в виду под , а не конкретно перегрузки. Добавлено через 3 минуты Скажем так, читать это надо было так:
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
20.09.2014, 14:58 | 55 |
По сути да, но контексты немного разные. Тогда скажем так: я показал практический пример, где фигня с int и nullptr_t происходит не только с перегрузкой функций.
0
|
DrOffset
|
20.09.2014, 15:00
#56
|
0
|
Убежденный
|
20.09.2014, 15:13
#57
|
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
20.09.2014, 15:40 | 58 |
Ну дак имя функции должно сообщать об этом. Если же имена функций будут скрывать, а не прояснять их поведение, то никто ничего не поймет, сколько нульпойнтеров туда ни напихай.
1
|
Заблокирован
|
||||||
20.09.2014, 18:59 [ТС] | 59 | |||||
По моему вот это бред (в Qt)
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
20.09.2014, 22:33 | 60 |
Scrooge McDuck, intellisense это патентованое от ms, которое работает в студии. Креатор не может, потому что не дорос еще.
0
|
20.09.2014, 22:33 | |
20.09.2014, 22:33 | |
Помогаю со студенческими работами здесь
60
Странное поведение оператора сравнения Поведение оператора echo при вызове функций Непонятное поведение поведение TIM6 на STM32f4discovery Избыточное копирование объекта при реализации оператора умножения и оператора присваивания Неправильная работа оператора присваивания после работы оператора суммирования Найти матрицу оператора сопряжённого для данного линейного оператора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |