У меня есть много LoadLibrary
в моем проекте, и вам нужно позвонить FreeLibrary
вручную для каждого LoadLibrary
. Я хочу использовать std::unique_ptr
с конкретным deleter
, чтобы он автоматически освобождал мой ресурс dll.Можно ли использовать std :: unique_ptr для управления ресурсом DLL?
Это то, что я пытаюсь определить:
std::unique_ptr<HMODULE, BOOL(*)(HMODULE)> theDll(LoadLibrary("My.dll"), FreeLibrary);
Но компилятор жалуется тип не соответствует. Я узнал, что он ожидает *HMODULE
от LoadLibrary
. То есть std::unique_ptr<A>
будет ожидать A*
в качестве своего типа указателя. По-видимому, мне еще нужно определить новый класс для управления ресурсом DLL (LoadLibrary
в конструкторе и FreeLibrary
в деструкторе).
Можно ли сделать std::unique_ptr<A>
, чтобы просто ожидать, что его тип указателя A
?
Обновлен,
Ниже плюсы и минусы для нового класса и с использованием зОго :: unique_ptr, обобщенных из ответов.
Создайте другой Dll класс управления,
плюсы:
- Полностью управляемый, чтобы настроить для DLL семантического.
- Изолируйте связанные с DLL части в класс с одной ответственностью.
- Простота расширения, если требуется больше функциональности для DLL, например, для отображения символа.
минусы:
- нужны перестраивать RAII часть, что Stadard авто указатель было сделано.
- Имеет шанс совершить ошибку в RAII-части.
- Need Объявить новый класс.
Использование std::unique_ptr
с пользовательскими Deleter,
плюсы:
- Нет необходимости объявить другой класс.
- Повторно использовать часть RAII
unique_ptr
. - Возможно,
move semantics
предотвращает копирование экземпляра модуля DLL?
минусы:
- Dll ресурс семантические может не соответствовать стандартному автоматическому указателю, и подвержены ошибкам?
- Параметр шаблона в
unique_ptr
является сложным и трудно найти, где ошибка. HMODULE
isvoid*
, тип типа типа, может быть проблемой для интеграции с unique_ptr?
Пожалуйста, исправьте меня в комментарии, если я ошибаюсь.
, честно говоря, я считаю, что упаковка DLL в классе немного более безопасна из-за обработки ошибок, хотя она изначально выглядела элегантно, используя unique_ptr –
@CyberSpock Полностью согласен. –
До сих пор я обнаружил, что могу проверить, является ли 'theDll.get()' null или не знать, выполнено ли LoadLibrary? '. http://stackoverflow.com/a/11164463/2210478, , если 'theDll.get()' равно null, 'std :: unique_ptr' не будет вызывать deleter при указателе. Поэтому я не беспокоюсь, что передаю NULL в FreeLibrary. –