Выражения без размещения или удаления не должны использоваться
Выражения без размещения или удаления не должны использоваться.
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 через исправления ошибок или обоснования.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Библиотека языковой поддержки |
Категория: Требуемая, Частично автоматизированная |