Если я использую foo = new int [5];
, и если распределение не выполняется, генерируется исключение, . Мой вопрос - как с ним справиться или как получить 0, если распределение не выполняется. А также ИТС зависит от версии C++ ..Как получить 0 при сбое в новом в C++
ответ
Использование:
foo = new(std::nothrow) int[5];
Он вернется NULL
об ошибке вместо того, чтобы выбросить. Вам может понадобиться добавить #include <new>
, чтобы получить определение std::nothrow
.
О версии зависимости, она довольно старая, от C++ 98 я думаю. Если вам посчастливилось иметь старую компилятор, скажем VisualStudio 6 или Turbo C, то, возможно, ошибка выделения будет всегда возвращение NULL
вместо того, чтобы бросать в первую очередь, так как std::bad_alloc
и std::nothrow
были введены в то же самое время.
В C++ 11 использования operator new с nothrow
Это, как правило, лучше, чтобы обернуть свой код в try ... catch
и поймать std::bad_alloc
чем использовать «не бросать» форму нового new (std::nothrow) ...
- главная причина это, что в то время как вы можете быть в состоянии контролировать свой код, но у вас есть класс вроде этого:
class mine
{
int x;
string s;
public:
... some member functions we don't care about here ...
};
и сделать
mine *p = new (std::nothrow) mine;
Если ваша система разряжена, std::string
вполне может не выделяться, и выкинуть std::bad_alloc
.
Единственное исключение может быть, если вы ЗНАЕТЕ, что определенное распределение, скорее всего, потерпит неудачу, и у вас есть «резервный», где вы выделяете меньший размер (например, для кеша или что-то еще). Однако это определенно плохая идея в Linux, поскольку она позволяет перехватывать (что приложение выделяет больше памяти, чем фактически доступно) - несколько недель назад на работе я изучал приложение, которое было убито за «из память ", и получается, что на нашем пользовательском оборудовании с 2 ГБ ОЗУ он выделялся до достижения 3 ГБ, а затем был убит« OOM Killer », потому что ОС была голодной от памяти.
«Лучше» зависит от контекста. Предположительно, он должен обрабатывать недостаток памяти локально. (Типичным примером этого является расширение буфера в редакторе. Если вы не можете его увеличить, вы должны вылить на диск.) –
Да, конечно, это не все или ничего. Основная причина, по которой я предлагаю, чтобы это было лучше, так это то, что вы должны быть ОЧЕНЬ осторожны, с каким объектом вы это делаете. POD отлично, все, что выделяет в конструкторе, скорее всего, не сработает. –
Согласовано. Использование нового броска для особых случаев (и, вероятно, только в приложениях, которые не используют ни один из стандартных контейнеров). –
- 1. Получить следующий номер при вставке, сбрасывается в 0 при новом
- 2. Общая память при сбое C++
- 3. TryParse помещает 0 в переменную при сбое анализа
- 4. Как получить 0 числового типа в C++?
- 5. ошибка при сбое при сбое iphone (прерывается)
- 6. Как получить цифры 0 при повторении через int в C
- 7. Как получить hidden_field работать при сбое проверки в Rails 3
- 8. Как я могу получить свой код при сбое в блокноте ++
- 9. Сбой при сбое при сбое при создании NSManagedObject, но почему?
- 10. Сбой при сбое NPM
- 11. Как получить трассировку стека при сбое сервера WAMP?
- 12. Как получить сообщение об ошибке SSIS при сбое пакета?
- 13. Ошибка при сбое в ошибке (0xc0000005)
- 14. Получить электронную почту при сбое задачи SSIS
- 15. Сбой при сбое при развертывании в Heroku
- 16. Ошибка при сбое Java
- 17. Ошибка при сбое SIGARBT
- 18. Ошибка при сбое NSString
- 19. Получить объект xhr в vb.net при сбое вызова ajax
- 20. Как откат при выполнении капистрано при сбое?
- 21. гиперссылка в новом окне C#
- 22. Сбой при сбое UISearchController
- 23. Как избежать запроса при сбое EXE
- 24. Перезапустить приложение при сбое
- 25. Сбой при сбое в телефонной книге
- 26. Ошибка при сбое Xcode
- 27. Сбой при сбое ListActivity
- 28. При сбое приложения Android при попытке получить длину строки
- 29. Как получить элемент dom в новом окне?
- 30. Как добавить ui-state-error в p: selectOneRadio при сбое
Также действителен в C++ 98. – Jarod42