Новые операторы и удаляют, не буду назван явным образом.
Новые операторы и удаляют, не буду назван явным образом.
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
и выходы, не удаляя указатель.
Чтобы избежать непредсказуемой утечки памяти, инкапсулируйте ресурсы, такие как динамически выделенная память или дескрипторы файлов, в объектах. Получите ресурсы в конструкторах 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 Адреса Через Исправления ошибок или Выравнивания.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: вспомогательная библиотека Языка |