Как правильно распределить память в C ++ в условиях нехватки памяти - PullRequest
12 голосов
/ 14 августа 2011

Я видел, как ресурсы показывают два способа выделения памяти, при этом гарантируя, что памяти было достаточно для завершения операции.

1) обернуть операцию 'new' в try / catch, так как она вернет std :: bad_alloc (?)

try { ptr = new unsigned char[num_bytes]; } catch(...) {}

2) проверить присвоенный указатель на нулевое значение после операции 'new'.

ptr = new unsigned char[num_bytes]; if(ptr == NULL) { ... }

Какой из них прав? Они оба работают? Должен ли я, возможно, сделать и 1 и 2?

Спасибо,

JBU

Ответы [ 3 ]

17 голосов
/ 14 августа 2011

Если вы используете стандартную реализацию new, которая выдает исключение, то первое из них правильное.

Вы также можете использовать второй, если вы используете nothrow как:

ptr = new (nothrow) unsigned char[num_bytes]; 
if(ptr == NULL) { ... }
6 голосов
/ 14 августа 2011

не удачное распределение [с использованием new] выдает std::bad_aloc, поэтому 1-й верен.

2-й используется для кода c, когда используется malloc [поскольку в C нет исключений, NULL использовался для обозначения неудачного выделения].

при использовании new оператор if никогда не выдаст true, поскольку, если выделение завершилось неудачно - будет выдано исключение, а оператор if не будет достигнут. и, конечно же, если распределение прошло успешно, оператор if выдаст false.

0 голосов
/ 14 августа 2011
try { ptr = new unsigned car[num_bytes]; } 
catch(std::bad_alloc& e) { cerr << "error: " << e.what() << endl; }

Вторая идиома больше подходит для malloc

...