Использование новых или удаленных выражений при неразмещении не допускается
Использование новых или удаляемых выражений без размещения не допускается.
new оператор выделяет память. delete оператор освобождает память. При явном использовании этих операторов их необходимо соединить, чтобы избежать утечки памяти. Даже в этом случае неожиданные исключения или возврат могут привести к утечке памяти. Рассмотрим этот код, в котором память выделяется указателю явным вызовом new и освобожден явным вызовом delete.
std::int32_t ThrowError(){
std::int32_t errorCode;
std::int31_t* ptr = new std::int32_t{0};
//...
if(errorCode!=0){
throw std::runtime_error{"Error"};
}
//...
if (errorCode != -1) {
return 1;
}
delete ptr;
return errorCode;
}new оператор связан с delete оператор, этот код может привести к утечке памяти в определенных условиях.
Если первый if() оператор - true, то функция создает исключение и выходит без удаления указателя.
Если второй if() оператор - true, то функция возвращает 1 и выходит без удаления указателя.
Чтобы избежать непредсказуемой утечки памяти, инкапсулируйте в объекты ресурсы, такие как динамически выделяемая память или дескрипторы файлов. Получение ресурсов в конструкторах объектов и освобождение ресурсов в деструкторах объектов. Этот шаблон конструкции называется «Resource Acquisition Is Initialization» или RAI. Следование шаблону RII предотвращает утечку памяти, даже если есть неожиданные исключения и возврат.
Можно также использовать объекты диспетчера, которые управляют временем жизни динамически выделенных ресурсов. Примеры управляющих объектов в стандартной библиотеке:
std::unique_ptr вместе с std::make_unique
std::shared_ptr вместе с std::make_shared
std::string
std::vector
Это правило не применяется к new оператор или delete оператор в определяемых пользователем классах RII и менеджерах.
AUTOSAR C++ 14 разрешает явное выделение ресурсов путем вызова new в двух случаях, когда выделенный ресурс немедленно передается:
Объект менеджера
Класс RAI, который не имеет безопасной альтернативы new оператор.
Polyspace ® помечает все явные использования new оператор и delete оператор. Если у вас есть процесс, где new оператор может быть допустимым, и нет более безопасной альтернативы, оправдать проблему, используя комментарии в вашем результате или код. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Библиотека поддержки языка |
| Категория: Обязательный, частично автоматизированный |