Выражения без размещения или удаления не должны использоваться
Выражения без размещения или удаления не должны использоваться.
The new оператор выделяет память. The 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» или RAII. Следование шаблону RAII предотвращает утечку памяти даже в случае неожиданных исключений и возвратов.
Кроме того, используйте объекты manager, которые управляют временем жизни динамически выделенных ресурсов. Примеры объектов менеджера в стандартной библиотеке включают:
std::unique_ptr наряду с std::make_unique
std::shared_ptr наряду с std::make_shared
std::string
std::vector
Это правило не применяется к new оператор или delete оператор в пользовательских классах RAII и менеджерах.
AUTOSAR C++ 14 позволяет явное выделение ресурсов путем вызова new оператор в двух случаях, когда выделенный ресурс немедленно передается:
Объект менеджера
Класс RAII, который не имеет безопасной альтернативы new оператор.
Polyspace® флаги всех явных применений new оператор и delete оператор. Если у вас есть процесс, где new оператор может быть допустим, и нет более безопасной альтернативы, обосновать проблему, используя комментарии в вашем результате или коде. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Библиотека языковой поддержки |
| Категория: Требуемая, Частично автоматизированная |