Когда ты не можешь обернуть локальную переменную в искусственный блок ({...}) для ограничения её времени жизни, реализуй функцию очистки, которая повторяет поведение деструктора. Однако не вызывай деструктор напрямую.
Создай отдельный метод (например, close()), который занимается освобождением ресурсов. Деструктор должен вызывать этот метод, а не содержать логику очистки сам по себе.
class File {
public:
void close();
~File();
private:
int fileHandle_; // >= 0 если открыт; -1 если закрыт
};
File::~File() {
close();
}
void File::close() {
if (fileHandle_ >= 0) {
// код очистки ОС здесь
fileHandle_ = -1;
}
}
fileHandle_ в -1fileHandle_ != -1 перед операциями-1) должно использоваться единообразно во всех методах для обозначения закрытого состоянияЭтот паттерн обеспечивает безопасное освобождение ресурсов даже когда подход с ограничением области видимости непрактичен, и при этом защищает от случайной двойной очистки или обращения к уже закрытому ресурсу.
Функция очистки, такая как close(), должна быть вызвана непосредственно из деструктора, чтобы избежать дублирования кода и убедиться, что ресурсы правильно освобождены.
Новый — ещё не проверен сообществом
Вы