Информация об изменениях

Сообщение Re[2]: Обработка ошибок в деструкторе своего умного указател от 23.12.2022 18:19

Изменено 23.12.2022 18:20 Sm0ke

Re[2]: Обработка ошибок в деструкторе своего умного указателя
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Sm0ke, Вы писали:


S>>Всем доброго времени суток.

S>>Написал свой класс умного указателя. В нём есть приватный метод clear(), в котором использую std::set и std::list как тип локальных переменных. Их значения не выходят за пределы этого метода, а служат просто для сбора данных.
S>>Собственно при работе с этой динамической памятью могут быть выкинуты исключения, которые я в самом clear() не ловлю. Но мне нужно вызвать clear() из деструктора класса.
S>>Пока что внутри деструктора Обернул вызов clear() в try, и при catch пишу инфу в статическое свойство s_state — структура с полем std::exception_ptr.

BFE>Допустим исключение было поймано. Как ваше приложение должно на него отреагировать? Что именно следует сделать?


Метод clear() должен решить следует ли вызвать m_target->unset(). Чтобы целевой объект корректно очистился, при необходимости.
Для этого в set<> кладутся возможные тупики, а list хранит пару итераторов для обхода. Есть спец условие досрочной остановки остановки обхода (в этом случае unset() не вызывается). Но когда всё обошли, то нужно вызвать unset() из clear().

BFE>Если моя телепатия меня не подводит, то единственным разумным решением будет поймать исключение и сделать запись о том, что сбор статистики невозможен ввиду отсутствия достаточного количества доступной памяти. После чего продолжить выполнение программы.


При исключении нельзя сказать наверняка следует ли вызвать этот unset(). Что может привести к утечке памяти (а может и нет).
Думаю сделаю счётчик possible_leak_count, чтобы в конце записать его в лог.

Ещё мб придётся в таргете хранить позицию строчки где он был создан... Это потеря производительности(
Re[2]: Обработка ошибок в деструкторе своего умного указател
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Sm0ke, Вы писали:


S>>Всем доброго времени суток.

S>>Написал свой класс умного указателя. В нём есть приватный метод clear(), в котором использую std::set и std::list как тип локальных переменных. Их значения не выходят за пределы этого метода, а служат просто для сбора данных.
S>>Собственно при работе с этой динамической памятью могут быть выкинуты исключения, которые я в самом clear() не ловлю. Но мне нужно вызвать clear() из деструктора класса.
S>>Пока что внутри деструктора Обернул вызов clear() в try, и при catch пишу инфу в статическое свойство s_state — структура с полем std::exception_ptr.

BFE>Допустим исключение было поймано. Как ваше приложение должно на него отреагировать? Что именно следует сделать?


Метод clear() должен решить следует ли вызвать m_target->unset(). Чтобы целевой объект корректно очистился, при необходимости.
Для этого в set<> кладутся возможные тупики, а list хранит пару итераторов для обхода. Есть спец условие досрочной остановки обхода (в этом случае unset() не вызывается). Но когда всё обошли, то нужно вызвать unset() из clear().

BFE>Если моя телепатия меня не подводит, то единственным разумным решением будет поймать исключение и сделать запись о том, что сбор статистики невозможен ввиду отсутствия достаточного количества доступной памяти. После чего продолжить выполнение программы.


При исключении нельзя сказать наверняка следует ли вызвать этот unset(). Что может привести к утечке памяти (а может и нет).
Думаю сделаю счётчик possible_leak_count, чтобы в конце записать его в лог.

Ещё мб придётся в таргете хранить позицию строчки где он был создан... Это потеря производительности(