Как правильно распределять память на С++ в условиях низкой памяти
Я видел, что ресурсы показывают два способа выделения памяти, гарантируя, что для завершения операции достаточно памяти.
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