Если функция выйдет за исключением, то перед броском, функция должна поместить все объекты/ресурсы, которые функция создала в допустимых состояниях, или это должно удалить их.
Если функция выйдет за исключением, то перед броском, функция должна поместить все объекты/ресурсы, которые функция создала в допустимых состояниях, или это должно удалить их.
Когда функция выходит за исключением, любым ресурсом или памятью, что выделенная функция не может быть правильно освобождена. Рассмотрите этот код:
FILE* FilePtr; //... void foo(){ FilePtr = fopen("some_file.txt", "r"); //... if(/*error condition*/) throw ERROR_CODE; delete FilePtr; }
FilePtr
перед throw
оператор.Вместо того, чтобы вручную отследить выделение и освобождение ресурсов, должна следовать лучшая практика, "Захват Ресурса Является Инициализацией" (RAII), или "Конструктор Получает, Релизы Деструктора" (КАДРЫ) шаблон разработки. В этом шаблоне распределение ресурсов выполняется в конструкторах, и освобождение ресурса выполняется в деструкторах. Жизненным циклом ресурсов управляют ограниченные осциллографом объекты в этом шаблоне. Когда функции достигают конца своего осциллографа, полученные средства правильно высвобождены. Рассмотрите этот код:
void releaseFile(std::FILE* fp) { std::fclose(fp); } std::unique_ptr<std::FILE, decltype(&releaseFile)> FilePtr; //... void foo(){ FilePtr(std::fopen("some_file.txt"),&releaseFile); //... if(/*error condition*/) throw ERROR_CODE; }
FilePTR
вызывает функциональный releaseFile
удалить выделенный ресурс однажды функциональный foo
достигает конца его осциллографа, или обычно или из-за необработанного исключения.Интеллектуальные указатели C++, такие как std::unique_ptr
и std::shared_ptr
следуйте за шаблоном RAII. Они упрощают управление жизненный цикл ресурсов во время обработки исключений. Избегайте использования необработанных указателей, когда это возможно.
Polyspace® отмечает непойманный throw
оператор в, если оператор может привести к утечке ресурсов. Например,
throw
оператор вне try
блок отмечается, если выделенные ресурсы не освобождены перед оператором.
throw
оператор в catch
блок отмечается, если ресурсы не освобождены прежде, чем повысить исключение.
Polyspace не отмечает throw
оператор, если это в try
блокируйтесь, который имеет соответствующий обработчик или если исключение повышено прежде, чем выделить ресурсы.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.