Атексит считается вредным?
Существуют ли опасности при использовании atexit
в больших проектах, таких как библиотеки?
Если да, то что это за технический характер? atexit
что может привести к проблемам в более крупных проектах?
2 ответа
Основная причина, по которой я бы не использовал atexit
в библиотеках то, что любое его использование связано с глобальным состоянием. Хорошая библиотека должна избегать глобального состояния.
Однако есть и другие технические причины:
Реализации требуются только для поддержки небольшого количества (32, я думаю)
atexit
обработчики. После этого возможно, что все звонкиatexit
сбой или что они преуспевают или терпят неудачу в зависимости от доступности ресурса. Таким образом, вам придется иметь дело с тем, что делать, если вы не можете зарегистрировать свойatexit
обработчик, и не может быть никакого хорошего способа продолжить.Взаимодействие
atexit
сdlopen
или другие способы загрузки библиотек динамически не определены. Библиотека, которая зарегистрировалаatexit
Обработчики не могут быть безопасно выгружены, и способы, которыми различные реализации справляются с этой ситуацией, могут различаться.Плохо написано
atexit
обработчики могут взаимодействовать друг с другом или просто плохо себя вести, что препятствует правильному завершению программы. Например, еслиatexit
Обработчик пытается получить блокировку, которая хранится в другом потоке и которая не может быть снята из-за состояния в данный моментexit
назывался.
Secure CERT имеет запись о atexit
когда не используется правильно:
ENV32-С. Все обработчики atexit должны возвращаться нормально