2014-10-20 2 views
1

Если я использую foo = new int [5];, и если распределение не выполняется, генерируется исключение, . Мой вопрос - как с ним справиться или как получить 0, если распределение не выполняется. А также ИТС зависит от версии C++ ..Как получить 0 при сбое в новом в C++

ответ

5

Использование:

foo = new(std::nothrow) int[5]; 

Он вернется NULL об ошибке вместо того, чтобы выбросить. Вам может понадобиться добавить #include <new>, чтобы получить определение std::nothrow.

О версии зависимости, она довольно старая, от C++ 98 я думаю. Если вам посчастливилось иметь старую компилятор, скажем VisualStudio 6 или Turbo C, то, возможно, ошибка выделения будет всегда возвращение NULL вместо того, чтобы бросать в первую очередь, так как std::bad_alloc и std::nothrow были введены в то же самое время.

3

Это, как правило, лучше, чтобы обернуть свой код в 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 », потому что ОС была голодной от памяти.

+1

«Лучше» зависит от контекста. Предположительно, он должен обрабатывать недостаток памяти локально. (Типичным примером этого является расширение буфера в редакторе. Если вы не можете его увеличить, вы должны вылить на диск.) –

+0

Да, конечно, это не все или ничего. Основная причина, по которой я предлагаю, чтобы это было лучше, так это то, что вы должны быть ОЧЕНЬ осторожны, с каким объектом вы это делаете. POD отлично, все, что выделяет в конструкторе, скорее всего, не сработает. –

+0

Согласовано. Использование нового броска для особых случаев (и, вероятно, только в приложениях, которые не используют ни один из стандартных контейнеров). –

Смежные вопросы