Умный указатель деструкторов в исключительных обстоятельствах - PullRequest
0 голосов
/ 12 декабря 2018

При чтении интеллектуальных указателей в C ++ большая часть информации сопровождается предупреждением:

"Имейте в виду, что деструктор интеллектуального указателя не будет (может) вызываться при таких обстоятельствах, как ненормальныйвыход (путем вызова std :: abort или std :: exit ()), или когда исключение распространяется из первичной функции потока, или когда объявленный метод noexcept выдает исключение ".

Мой вопросзаключается в том, что во всех этих случаях программа в конце концов завершается, и в этом случае память, на которую указывал умный указатель, возвращается ОС, когда очищаются таблицы страниц для процесса (я знаю, что стандарт C ++ не обсуждает таблицы страниц и виртуальныепамяти, но я упоминаю об этом здесь, потому что это стандартная практика в большинстве операционных систем).

Так почему выдается это предупреждение?Что может быть худшего, если деструктор не вызывается?Или это предупреждение, о котором мне нужно знать, когда я использую умный указатель для управления ресурсом, кроме памяти?Если да, то что это за ресурсы?

1 Ответ

0 голосов
/ 12 декабря 2018

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

Решение состоит в том, чтобы предотвратить возникновение обстоятельств.

аварийный выход (путем вызова std ::abort или std :: exit ())

Не звоните abort или exit.Пусть все вызываемые функции возвращаются и позволяют main делать return.

или когда исключение распространяется из первичной функции потока

Перехватывать все исключения в main.Тогда return.Или, если глобальных объектов нет, вы также можете abort.

или когда объявленный метод noexcept выдает исключение ".

Не добавляйте noexcept functions.

Проблемы, которые могут возникнуть, связаны не только с памятью. Интеллектуальный указатель, удаляющий удерживаемый указатель, запускает деструктор объекта, на который он указывает. Объект может содержать внешние ресурсы.например, файл (или сокет), который должен быть сброшен (записывая буферизованный ввод / вывод) перед его закрытием.Это также может быть аппаратное обеспечение низкого уровня, такое как GPIO, которое, например, включает свет во время операции и включаетэто в деструкторе.

...