Новое неразмещение или удаляет выражения, не буду использоваться
Новое неразмещение или удаляет выражения, не буду использоваться.
Явное использование неразмещения 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; }
Если первый if()
оператором является true
, затем функция производит исключение и выходы, не удаляя указатель.
Если второй if()
оператором является true
, затем функция возвращает 1
и выходы, не удаляя указатель.
Чтобы избежать непредсказуемой утечки памяти, не используйте неразмещение new
и delete
операторы. Вместо этого инкапсулируйте динамически выделенные ресурсы в объектах. Получите ресурсы в конструкторах Object и высвободите средства в объектных деструкторах. Этот шаблон разработки называется "Захватом Ресурса, Инициализация" или RAII. После шаблона RAII предотвращает утечку памяти, даже когда существуют непредвиденные исключительные ситуации, и возвращается.
В качестве альтернативы используйте объекты менеджера, которые управляют временем жизни динамически выделенных ресурсов. Примеры объектов менеджера в стандартной библиотеке включают:
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 Через Исправления ошибок или Выравнивания, если вы рассматриваете результаты в пользовательском интерфейсе Polyspace.
Обратитесь к Результатам в Polyspace доступ Через Исправления ошибок или Выравнивания, если вы рассматриваете результаты в веб-браузере.
Аннотируйте Код и Скройте Известные или Приемлемые результаты, если вы рассматриваете результаты в IDE.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: вспомогательная библиотека Языка |
Категория: Необходимый, Частично автоматизированный |