Заблокирован
1

Поведение оператора new платфоромозависимое?

19.09.2014, 11:04. Показов 2982. Ответов 59
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В случае неудачи оператора new, допустим out of memory, он может кинуть исключение или вернуть ноль:
MSDN:
If unsuccessful, new returns zero or throws an exception
Подскажите, а это поведение так сказать платформ депендет или на всех платформах по дефолту он ведёт себя одинаково. Это же поведение можно поменять ?
0
19.09.2014, 11:04
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2014, 11:04
Ответы с готовыми решениями:

Не понятное поведение тернарного оператора
#include "stdafx.h" #include <initializer_list> #include <iostream> #include <algorithm> int mas =...

Неправильное поведение программы с использованием логического оператора или
while((ch=_getche())!='.') a=a*10+ch-'0'; ch='0'; while((ch=_getche())!='.') b= b*10+(ch-48); ch='0'; ...

Поясните поведение оператора ==
Почему == возвращает false а Equals true ? Для object a = 2; object b = 2; Я знаю что Equals на значимых типах проверяет равенство...

59
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
19.09.2014, 11:36 2
Лучший ответ Сообщение было отмечено Scrooge McDuck как решение

Решение

Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Подскажите, а это поведение так сказать платформ депендет или на всех платформах по дефолту он ведёт себя одинаково. Это же поведение можно поменять ?
По стандарту по-умолчанию обязан кидать исключение. Если нужно это поведенеи поменять, то нужно использовать nothrow версию:
C++
1
T *p = new (std::nothrow) T;
Однако, в некоторых старых средах, созданных до принятия стандарта 98 года, это правило может не соблюдаться.
3
Заблокирован
19.09.2014, 11:46  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Если нужно это поведенеи поменять, то нужно использовать nothrow версию:
А в таком случае что произойдёт? Ноль вернёт?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.09.2014, 11:47 4
Да, вернет. Только не ноль, а NULL.
1
Заблокирован
19.09.2014, 11:48  [ТС] 5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Только не ноль, а NULL.
с какого это? NULL это чисто дефайн WinAPI же.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.09.2014, 11:56 6
Хе-хе. Мы ж находимся в контексте форума по C++, не так ли? Каким боком тут WinAPI ?

Открой для себя мир архитектур, отличных от x86, и мир операционных систем, отличных от Windows. Да, они существуют! И пишут для них - да, все на тех же самых языках C и C++....
Строго говоря, по Стандарту языка битовое представление NULL не обязано быть 0x0000... То, что в некоторой архитектуре или операционной системе это так - всего лишь деталь реализации.
3
Заблокирован
19.09.2014, 12:07  [ТС] 7
Цитата Сообщение от CheshireCat Посмотреть сообщение
Открой для себя мир архитектур, отличных от x86, и мир операционных систем, отличных от Windows.
Да я ща пишу софт на Qt на Windows под пингвинов и Mac (ну под Windows само собой), я знаю, что такое другие ОС
Цитата Сообщение от CheshireCat Посмотреть сообщение
Строго говоря, по Стандарту языка битовое представление NULL не обязано быть 0x0000...
А вот на счёт NULL, честно говоря думал что это чисто дефайн из какого - то файла WINAPI, попробовал в QtCreator -е его вбить, не ругается )))
Так что, для указателей корректно использовать nullptr, а для нулей NULL что ли ?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2207 / 1412 / 411
Регистрация: 16.05.2013
Сообщений: 3,599
Записей в блоге: 6
19.09.2014, 12:12 8
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
А вот на счёт NULL, честно говоря думал что это чисто дефайн из какого - то файла WINAPI, попробовал в QtCreator -е его вбить, не ругается )))
И не будет. Это макрос из cstddef.
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Так что, для указателей корректно использовать nullptr, а для нулей NULL что ли ?
До появления стандарта С++11 NULL был указателем замаскированным целым типом. В новом стандарте для этого предусмотрен новый тип nullptr_t.
2
Заблокирован
19.09.2014, 12:17  [ТС] 9
Цитата Сообщение от Ilot Посмотреть сообщение
В новом стандарте для этого предусмотрен новый тип nullptr_t.
Что - то не очень понял, для нулевого указателя в C++11 я использую nullptr, а nullptr_t это как бы для нулевых переменных что ли или для чего, что - то по докам понять не могу...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
19.09.2014, 12:18 10
Да, NULL - это чистый define компилятора, для x86 и сходных архитектур он часто определен как
C++
1
#define NULL ((void*)0)
Отмечу, что преобразование (int)0 -> (void*)NULL определено Стандартом языка как standard integral conversion, и обязано всегда выполняться. При этом тот же Стандарт не накладывает ограничений на внутреннее битовое представление этого NULL и оставляет этот вопрос на усмотрение компилятора - как там компилятор будет перемешивать и переставлять биты, это его личное дело.
В то же время, преобразование (void*)NULL -> (int)0 не существует.

Для компиляторов, поддерживающих Стандарт C++11, более правильным решением будет использовать именно nullptr.
3
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2207 / 1412 / 411
Регистрация: 16.05.2013
Сообщений: 3,599
Записей в блоге: 6
19.09.2014, 12:19 11
Scrooge McDuck, nullptr_t это тип, а nullptr это единственное значение этого типа.
1
Неэпический
 Аватар для Croessmah
18123 / 10708 / 2063
Регистрация: 27.09.2012
Сообщений: 26,996
Записей в блоге: 1
19.09.2014, 12:21 12
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
ля нулевого указателя в C++11 я использую nullptr, а nullptr_t это как бы для нулевых переменных что ли или для чего, что - то по докам понять не могу...
C++
1
typedef decltype(nullptr) nullptr_t;
1
Заблокирован
19.09.2014, 12:28  [ТС] 13
Цитата Сообщение от Croessmah Посмотреть сообщение
typedef decltype(nullptr) nullptr_t;
то есть возвращаясь с сабжу, при вызове new так
Цитата Сообщение от DrOffset Посмотреть сообщение
T *p = new (std::nothrow) T;
правильней сказать, что оператор вернёт не NULL, а nullptr_t что ли в С++ 11?

то есть грубо говоря nulltptr_r это 0, а nullptr это 0* ?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.09.2014, 12:48 14
Цитата Сообщение от CheshireCat Посмотреть сообщение
#define NULL ((void*)0)
Скорее как NULL 0, так как NULL ( void * )0 может привести к ошибкам на C++.

Добавлено через 4 минуты
nullptr это непосредственно объект. nullptr_t это тип этого объекта.
1
Заблокирован
19.09.2014, 12:59  [ТС] 15
Цитата Сообщение от Toshkarik Посмотреть сообщение
nullptr_t это тип этого объекта.
тогда получается nullptr_t вообще не нужен, ну зачем может понадобиться проверка типа того, что возвращает какая - то функция, если речь идёт о нуле или не нуле?
C++
1
2
3
4
5
Obj *obj = new (std::nothrow) Obj;
if(obj != nullptr)
{
    //All OK
}
Для чего nullptr_t то может быть использован, никак не пойму ?
0
Неэпический
 Аватар для Croessmah
18123 / 10708 / 2063
Регистрация: 27.09.2012
Сообщений: 26,996
Записей в блоге: 1
19.09.2014, 12:59 16
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
то есть грубо говоря nulltptr_r это 0, а nullptr это 0* ?
Может с цитатами понятнее будет:
2.14.7
The pointer literal is the keyword nullptr. It is a prvalue of type std::nullptr_t. [Note: std::nullptr_t is a distinct type that is neither a pointer type nor a pointer to member type; rather, a prvalue of this type is a null pointer constant and can be converted to a null pointer value or null member pointer value. See 4.10 and 4.11. - end note ]

4.10
A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to zero or a prvalue of type std::nullptr_t . A null pointer constant can be converted to a pointer type; the result is thenull pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type. Such a conversion is called a null pointer conversion. Two null pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification conversion (4.4). A null pointer constant of integral type can be converted to a prvalue of type std::nullptr_t. [Note: The resulting prvalue is not a null pointer value.—end note]

4.11
A null pointer constant (4.10) can be converted to a pointer to member type; the result is the null member pointer value of that type and is distinguishable from any pointer to member not created from a null pointer constant. Such a conversion is called a null member pointer conversion. Two null member pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to member of cv-qualified type is a single conversion, and not the sequence of a pointer to member conversion followed by a qualification conversion (4.4).
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Для чего nullptr_t то может быть использован, никак не пойму ?
Например, для перегрузки и разрешения конфликтов:
C++
1
2
3
4
5
6
void foo ( int ) { }
void foo ( int* ) {  }
//void foo ( std::nullptr_t ) {  }
//...
    foo ( NULL ) ;
    foo ( nullptr ) ;
1
Заблокирован
19.09.2014, 13:12  [ТС] 17

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
void foo
почему все в тестовых целях называют функции "ФУУ", воняет что ли где то ? :rofl: Нет, что бы Function, или Func или Test ...



Цитата Сообщение от Croessmah Посмотреть сообщение
Например, для перегрузки и разрешения конфликтов:
ничего не понял
Цитата Сообщение от Croessmah Посмотреть сообщение
foo ( NULL ) ;
* * foo ( nullptr )
Ну где NULL, вызовется foo(int), а для (nullptr) вызовется (int*), а при чём тут nullptr_t (который заремарен), не могу понять ... Объясните вы на пальцах неучу :black_eye.:
0
Неэпический
 Аватар для Croessmah
18123 / 10708 / 2063
Регистрация: 27.09.2012
Сообщений: 26,996
Записей в блоге: 1
19.09.2014, 13:16 18
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
почему все в тестовых целях называют функции "ФУУ", воняет что ли где то ? Нет, что бы Function, или Func или Test ...
Метапеременная
foo часто используется как первая метапеременная, для обозначения неопределённого (пока) объекта: функции, процесса, и т. п. Этимология этого слова также раскрывается в первоапрельском RFC RFC 3092.
2
Заблокирован
19.09.2014, 13:20  [ТС] 19
Цитата Сообщение от Croessmah Посмотреть сообщение
Метапеременная

так что по поводу реального применения nullptr_t в коде ?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.09.2014, 13:21 20
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Ну где NULL, вызовется foo(int), а для (nullptr) вызовется (int*),
Неверно. Компилятор выдаст ошибку о неоднозначном разрешении перегрузки. NULL может быть как и int, так и int* в равной степени. В случае же с nullptr, вызвана будет foo( int * ). А если раскомментировать foo( nullptr ), то предпочтение будет отдано ей.
1
19.09.2014, 13:21
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.09.2014, 13:21
Помогаю со студенческими работами здесь

Необычное поведение оператора инкремента
Добрый день! Это просто несчастье какое-то. Я пытаюсь посчитать коэффициенты корреляции, рассматривая строку из 16 массивов по 4 бит....

Странное поведение оператора сравнения
Доброго всем времени суток. Есть у меня такой вот скрипт: function access(button) { var expert =...

Поведение оператора echo при вызове функций
Здравствуйте, заметил вот такое поведение: function foo() { echo 'hello'; } echo foo(); // output: hello По-идее,...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о. частота тактирования на таймере=42Мгц ...

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В данном коротком примере я просто моделирую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Отключение отслеживания файла, занесенного в .gitignore в Git
hw_wired 10.02.2025
Git помогает следить за изменениями в проекте, но иногда требуется исключить определенные файлы из системы контроля версий. Это могут быть конфигурационные файлы с локальными настройками, временные. . .
Что такое use strict в JavaScript
hw_wired 10.02.2025
Директива use strict - способ перевода JavaScript-кода в строгий режим работы, который делает язык более безопасным и предсказуемым. Она появилась в ECMAScript 5 как ответ на многочисленные проблемы,. . .
Как в jQuery проверить, что элемент скрыт
hw_wired 10.02.2025
jQuery предоставляет несколько эффективных способов определить, скрыт элемент или отображается на странице. Самый простой метод использует специальные селекторы :hidden и :visible. Селектор :hidden. . .
Как проверить (check out) ветку Git в удаленном репозитории
hw_wired 10.02.2025
Проверка удаленной ветки в Git требует понимания нескольких базовых концепций и точного выполнения определенной последовательности действий. Для начала необходимо получить актуальную информацию о. . .
chucknorris в HTML и другие обозначения цветов
hw_wired 10.02.2025
HTML, как основной язык разметки веб-страниц, прошел длинный путь развития в плане работы с цветами. На заре развития веб-технологий разработчики могли использовать только базовый набор из 16. . .
Стек и куча: отличия и назначение
hw_wired 10.02.2025
Управление памятью - ключевой элемент работы любой программы. В современных языках программирования память делится на две основные области: стек и кучу. Каждая из них обладает уникальными. . .
Комментарии в JSON
hw_wired 10.02.2025
JSON - текстовый формат обмена данными, построенный на основе синтаксиса JavaScript. Этот формат отличается простотой, читаемостью и широкой поддержкой во всех современных языках программирования. . . .
Перезаписываем локальные файлы с помощью git pull
hw_wired 10.02.2025
Git pull - незаменимая команда для синхронизации локального репозитория с удаленным. При работе над проектом в команде разработчиков часто возникает необходимость получить актуальные изменения,. . .
Оператор --> в C++
hw_wired 10.02.2025
Оператор --> (называемый "spaceship operator" или оператор космического корабля) - важное нововведение в стандарте C++20, упрощающее реализацию операций сравнения в пользовательских типах данных. . . .
Отмена git add до коммита
hw_wired 10.02.2025
Git предлагает несколько методов для отмены индексации файлов перед созданием коммита. Разработчики часто сталкиваются с ситуацией, когда нужно убрать файлы из индекса, не теряя внесенные изменения в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru