Как правильно распределять память на С++ в условиях низкой памяти

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

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

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

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

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

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

Спасибо,

JBU

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

try { ptr = new unsigned car[num_bytes]; } 
catch(std::bad_alloc& e) { cerr << "error: " << e.what() << endl; }

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