Resource management
R.10
Избегайте `malloc()` и `free()`
Причина
malloc() и free() не поддерживают конструирование и уничтожение объектов, а также плохо сочетаются с new и delete.
Пример
class Record {
int id;
string name;
// ...
};
void use()
{
// p1 может быть nullptr
// *p1 не инициализирован; в частности,
// string — не строка, а набор байт размером со string
Record* p1 = static_cast<Record*>(malloc(sizeof(Record)));
auto p2 = new Record;
// если исключение не выброшено, *p2 инициализирован по умолчанию
auto p3 = new(nothrow) Record;
// p3 может быть nullptr; если нет — *p3 инициализирован по умолчанию
// ...
delete p1; // ошибка: нельзя удалить объект, выделенный через malloc()
free(p2); // ошибка: нельзя освободить объект, выделенный через new
}
В некоторых реализациях вызовы delete и free() могут сработать — или вызвать ошибки во время выполнения.
Исключение
Существуют приложения и фрагменты кода, в которых исключения недопустимы. Лучшие примеры — критически важный жёсткий real-time код. Учтите, что многие запреты на исключения основаны на суевериях (плохо) или соображениях о старых кодовых базах с несистематическим управлением ресурсами (к сожалению, иногда оправданно). В таких случаях рассмотрите версии new с nothrow.
Контроль
Отмечать явное использование malloc и free.