2015-04-15 2 views
1

Полезно ли регистрировать вывод в файл в деструкторе класса C++? Моим вариантом использования является симулятор, в котором у меня есть класс ведения журнала, который регистрируется в структуре данных в памяти, а затем сбрасывает все это в файл, когда он разрушен.Регистрация в деструкторе

Это похоже на вопрос здесь (C# class: Do logging/housekeeping, should I use a destructor?), но мой вопрос касается стандартного не собранного мусора C++, а не C#.

+2

Нет причин, по которым вы не могли этого сделать. Вы не должны вызывать исключение из деструктора, но в остальном вы можете делать почти все, что хотите, включая такие вещи, как например. освобождая ресурсы/память/блокировки или хорошо, регистрируя, что объект был уничтожен. – Damon

+0

Это зависит от того, как вы собираетесь настроить регистрацию. Используете ли вы стандартный IO (либо cstdio, либо iostream)? Вы используете рамки? Что-то более развитое? Не должно быть проблем с регистрацией деструкторов, но убедитесь, что вы не разрешаете вашему журналу генерировать исключения (в частности, не обрабатывать ошибки ввода-вывода при регистрации таким образом) –

ответ

2

Возможно, но don't throw exceptions. Вы должны предвидеть ошибки ввода-вывода и проглатывать их или иным образом распоряжаться ими, не бросая.

+0

Спасибо за ответы. Я запомню, что поймаю исключения в деструкторе. – Anirudh

1

Ну, вы МОЖЕТЕ это сделать, но я бы не рекомендовал его.

Прежде всего, это нехорошо тянуть странные дизайнерские трюки. Вероятно, вы в конечном итоге запутываете свой код. Основная цель существования Destructor - освобождение ресурсов, выделенных вашим классом, например файлов или памяти.

Другой проблемой является исключение. Если вы попытаетесь добавить операцию ввода-вывода в свой деструктор, и что-то пойдет не так, вы не сможете ее увидеть. Итак, скажем, у вас есть это огромное приложение, где журналы имеют жизненно важное значение. Вы можете пропустить журнал. Или еще хуже, есть неожиданные данные в журнале.

В любом случае, я рекомендую вам добавить в ваш класс функцию bool Shutdown(). Вот что я делаю в подобных случаях. Таким образом вы контролируете, что происходит.

Надеюсь, я помог.

Смежные вопросы