Ситуация дескриптора после сбоя dlclose()/FreeLibrary()

Я оборачиваю зависящий от ОС API загрузки общих библиотек во время выполнения в переносимый интерфейс.

Проблема в том, что при документировании функции close() я заметил, что нет документации о том, что происходит, если функция dlclose() или FreeLibrary() дает сбой. Можно ли использовать дескриптор, так как библиотеку нельзя закрыть? Или он находится в каком-то поврежденном состоянии? Могу ли я все еще использовать его?

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


person RenatoUtsch    schedule 09.11.2013    source источник
comment
Позвоните GetLastError, сообщите об ошибке и задокументируйте состояние дескриптора как Unspecified. На самом деле вы мало что можете сделать, если очистка не удалась.   -  person IInspectable    schedule 09.11.2013


Ответы (1)


Как только вы вызываете dlcose, дескриптор больше не подходит для вашего использования:

http://pubs.opengroup.org/onlinepubs/007904975/functions/dlclose.html

Как только объект был закрыт с помощью dlclose(), приложение должно предположить, что его символы больше не доступны для dlsym().

Вполне возможно, что dlclose() ничего не делает. Потому что другие библиотеки также имеют дескрипторы библиотеки. Если закрытие не удается, это обычно означает, что кто-то другой использует его. НО это не означает, что вы можете использовать его снова через свой дескриптор (который мертв).

Ошибка обычно указывает на то, что ваш дескриптор недействителен.

person Martin York    schedule 09.11.2013
comment
Тогда, даже если dlclose() не работает, могу ли я присвоить дескриптору значение NULL? Поскольку dlclose(), вероятно, больше не будет работать... Может ли этот сбой вызвать утечку памяти? - person RenatoUtsch; 09.11.2013
comment
Да, установите дескриптор в NULL. Вы можете что-нибудь сделать с утечкой памяти? Есть еще звонки? Не так много вы можете сделать, когда дескриптор недействителен. - person Martin York; 10.11.2013
comment
Спасибо. Пойдет с этим. - person RenatoUtsch; 10.11.2013