Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
mxs89
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
Завершенные тесты: 1
#1

New MyClass & GetLastError - C++

07.03.2016, 16:58. Просмотров 311. Ответов 15
Метки нет (Все метки)

подскажите, допустим, закончилась память и при выделении для объекта
C++
1
myclass = new MyClass
myclass будет содержать NULL, а что будет содержать GetLastError? ERROR_OUTOFMEMORY?

т.е. нужно ли писать:
C++
1
2
if(myclass == NULL)
SetLastError(ERROR_OUTOFMEMORY)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2016, 16:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос New MyClass & GetLastError (C++):

Отличие Myclass& от Myclass* в аргументах функции
Доброго времени суток. Новичок в С++ (раньше писал на всяких питонах и пхп)....

Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss;
Собственно, что происходит, когда создаёшь объект класса без скобок в название...

friend ostream &operator<<(ostream &stream, MyClass o);
Что означает данная строчка которую обычно пишут в конце класса? friend...

Vector<MyClass> MyVector или вектор типа MyClass - C++
Допустим у меня есть код ежедневника с классом Time, тут есть проверка времени,...

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;)
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef...

Вопрос по GetLastError
Кто поможет советом? Создаю обычную консольку, в ней пытаюсь функцией...

15
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.03.2016, 17:59 #2
Цитата Сообщение от mxs89 Посмотреть сообщение
myclass будет содержать NULL
Не будет. Будет исключение.

Цитата Сообщение от mxs89 Посмотреть сообщение
а что будет содержать GetLastError?
GetLastError никак не связан с new.
1
mxs89
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
Завершенные тесты: 1
09.03.2016, 10:31  [ТС] #3
зачем тогда проверка на NULL?
0
Usaga
Эксперт .NET
3730 / 3022 / 549
Регистрация: 21.01.2016
Сообщений: 11,995
Завершенные тесты: 2
09.03.2016, 10:34 #4
Чтобы убедиться, что myclass указывает на что-нибудь полезное (другими словами, что переменная инициализирована). Сразу после new этого делать не нужно.
0
mxs89
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
Завершенные тесты: 1
09.03.2016, 10:38  [ТС] #5
а когда это нужно делать?

после new переменная содержит адрес области...

я полагаю, чтобы не было исключения нужно писать так:
C++
1
new (std::nothrow) MyClass
0
Usaga
Эксперт .NET
3730 / 3022 / 549
Регистрация: 21.01.2016
Сообщений: 11,995
Завершенные тесты: 2
09.03.2016, 10:48 #6
Да, тогда, при нехватке памяти, будет возвращён ноль (NULL).
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,929
Записей в блоге: 3
Завершенные тесты: 1
09.03.2016, 10:51 #7
Цитата Сообщение от mxs89 Посмотреть сообщение
я полагаю, чтобы не было исключения нужно писать так
смысла нет. Если выделение зафейлится, то не факт,
что вернется nullptr или что вылетит исключение.
Тогда ошибка произойдет уже при обращении к недоступной нам памяти.
Так что, имхо, лучше ловить исключение bad_alloc, которое стрельнет в случае чего,
и еще отлавливать segfault'ы, а не захламлять код бесполезными if'ами.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.03.2016, 10:56 #8
Croessmah, Ну... Это не совсем верно с моей точки зрения.
If the allocation function return a null pointer, which is possible if the non-throwing overload was selected, e.g. with new(std::nothrow) T;, then the new-expression returns immediately, it does not attempt to initialize an object or to call a deallocation function.
Вполне себе гарантированно, что вернется nullptr.
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,929
Записей в блоге: 3
Завершенные тесты: 1
09.03.2016, 11:07 #9
ForEveR, это откуда?
И вообще, выделение памяти может быть отложено,
а значит new в этом случае вернет не nullptr

Добавлено через 2 минуты
Думаю, что я где-то еще об этом читал.
Точно - у Саттера в его новых сложных задачах на эту тему целая глава.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.03.2016, 11:20 #10
Croessmah, Отсюда: http://en.cppreference.com/w/cpp/language/new
Да, я Саттера тоже читал и сейчас даже специально открыл, и естественно я не предлагаю использовать nothrow new. Но с точки зрения стандарта - все именно так. nothrow вернет nullptr при проблемах с памятью, обычный кинет bad_alloc. То, что это не будет работать на некоторых осях (на которых всегда возвращается успех на выделении памяти) или еще какие проблемы - не являются проблемой стандарта.
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,929
Записей в блоге: 3
Завершенные тесты: 1
09.03.2016, 11:24 #11
Из Саттера:
Избегайте использования new(nothrow)
...
2. Помогает ли использование не генирирующей исключения версии оператора new сделать код более безопасным с точки зрения исключений?
...
Ответ: нет, на самом деле не помогает.
...
Ни один из способов, которыми оператор new сообщает о произошедшей ошибке, не дает никакой дополнительной информации и не обеспечивает дополнительной безопасности, так что ни один из них не делает программу безопаснее или менее подверженной ошибкам
...
Не генерирующий исключений оператор new не добавляет программе ни корректности, ни безопасности исключений.
Для некоторых ошибок, а именно ошибок, которые игнорируются программой, - этот вариант оказывается хуже, чем вариант new с генерацией исключений, поскольку последний вариант дает хоть какой-то шанс для сохранения состояния во время свертки стека.

В большинстве случаев не генерирующие исключений операторы new не дают никаких преимуществ.
...
Очень часто проверка отказа в операторе new бесполезна
...
Проверка результата работы new может оказаться бесполезной в ОС, которая реально не выделяет память до дех пор, пока к ней не осуществляется обращение. В некоторых операционных системах системные функции выделения памяти завершаются всегда успешно. Точка.
...
Заметим, что если оператор new использует возможности ОС непосредственно, то он всегда завершается успешно, но последующий за ним невинный код наподобии buf[100] = 'c'; может привести к генерации исключения или аварийному останову.
Цитата Сообщение от ForEveR Посмотреть сообщение
Но с точки зрения стандарта - все именно так. nothrow вернет nullptr при проблемах с памятью, обычный кинет bad_alloc.
Я писал, что нет гарантии, что какие-то проверки вообще помогут

Добавлено через 50 секунд
Цитата Сообщение от ForEveR Посмотреть сообщение
То, что это не будет работать на некоторых осях (на которых всегда возвращается успех на выделении памяти) или еще какие проблемы - не являются проблемой стандарта.
Ну тогда не вижу особого смысла в лишних if'ах вот я о чем
1
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
09.03.2016, 12:13 #12
Цитата Сообщение от Саттер Посмотреть сообщение
если оператор new использует возможности ОС непосредственно, то он всегда завершается успешно
Вот что-то сильные сомнения у меня по поводу этого. Точный перевод?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.03.2016, 12:55 #13
HighPredator, Там сложнее. Там описываются ОС которые так делают. Просто вырезка не полная.
1
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
09.03.2016, 13:09 #14
ForEveR, ясно, спасибо.
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,929
Записей в блоге: 3
Завершенные тесты: 1
09.03.2016, 13:18 #15
Цитата Сообщение от HighPredator Посмотреть сообщение
Вот что-то сильные сомнения у меня по поводу этого. Точный перевод?
Например, если под линуксом выставить OVERCOMMIT_ALWAYS,
то оно будет всегда успешно, вроде,
во всяком случае у меня хоть 500 Гб выделяй, без разницы.
Думаю, можно и код написать, который к падению приведет, но черт его знает )))
0
mxs89
11 / 11 / 8
Регистрация: 13.04.2015
Сообщений: 159
Завершенные тесты: 1
09.03.2016, 15:18  [ТС] #16
как на счет malloc?
0
09.03.2016, 15:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2016, 15:18
Привет! Вот еще темы с решениями:

Не получается открыть семафор. GetLastError 5
Пишу программу Парикмахерская. Она подразумевает использование семафоров....

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp;...

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9&
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка?
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru