Che*_* OT 9 c++ dll raii c++11
LoadLibrary
我的项目中有很多,需要FreeLibrary
手动调用每个项目LoadLibrary
.我想使用std::unique_ptr
with specific deleter
来使它自动释放我的dll资源.
这就是我想要定义的内容:
std::unique_ptr<HMODULE, BOOL(*)(HMODULE)> theDll(LoadLibrary("My.dll"), FreeLibrary);
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨类型不匹配.我发现它期望*HMODULE
从LoadLibrary
.这std::unique_ptr<A>
将A*
是它的指针类型.看起来我仍然需要定义一个新类来管理DLL资源(LoadLibrary
在构造函数和FreeLibrary
析构函数中).
有可能std::unique_ptr<A>
只是期望A
它的指针类型?
更新,
以下是新类的优缺点,并使用std :: unique_ptr,从答案中总结出来.
创建另一个dll管理类,
优点:
缺点:
std::unique_ptr
与自定义删除器一起使用,
优点:
unique_ptr
.move semantics
防止DLL模块实例被复制?缺点:
unique_ptr
很复杂,很难找到错误的位置.HMODULE
是void*
,无类型,可能是与unique_ptr集成的问题?如果我错了,请在评论时纠正我.
根据这个页面,HMODULE是HINSTANCE,HINSTANCE是HANDLE,HANDLE是PVOID,PVOID是无效*.这意味着HMODULE是指针类型.所以以下应该有效:
std::unique_ptr<std::remove_pointer_t<HMODULE>, BOOL(*)(HMODULE)> theDll(LoadLibrary("My.dll"), FreeLibrary);
Run Code Online (Sandbox Code Playgroud)
如果您使用它来管理未引用的资源,则需要提供相应的::pointer
类型.这是第一个模板参数.unique_ptr
T
T*
T
unique_ptr
如果::pointer
未定义任何类型,T*
则使用.在你的情况下,HMODULE*
这是错的.
struct tLibraryDeleter
{
typedef HMODULE pointer;
void operator()(HMODULE h) { FreeLibrary(h); }
};
std::unique_ptr<HMODULE, tLibraryDeleter>(::LoadLibraryA("My.dll"));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1583 次 |
最近记录: |