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