gpt4 book ai didi

c++ - 是否可以使用 std::unique_ptr 来管理 DLL 资源?

转载 作者:可可西里 更新时间:2023-11-01 16:36:15 26 4
gpt4 key购买 nike

我有很多LoadLibrary在我的项目中,需要调用 FreeLibrary手动为每个 LoadLibrary .我想使用 std::unique_ptr具体deleter让它自动释放我的 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作为它的指针类型?

已更新,

以下是新类和使用 std::unique_ptr 的优缺点,从答案中总结。

再创建一个dll管理类,

优点:

  • 完全可控以针对 DLL 语义进行自定义。
  • 将与 DLL 相关的部分隔离到一个单一职责的类中。
  • 如果 DLL 需要更多功能(如公开符号),则易于扩展。

缺点:

  • 需要重建 RAII 部分,标准自动指针已经完成。
  • 有机会在 RAII 部分出错。
  • 需要声明一个新类。

使用 std::unique_ptr使用自定义删除器,

优点:

  • 无需声明另一个类。
  • 重复使用 unique_ptr 的 RAII 部分.
  • 也许是 move semantics防止 DLL 模块实例被复制?

缺点:

  • Dll 资源语义可能不适合标准的自动指针,并且容易出错?
  • unique_ptr中的模板参数很复杂,很难找到错误所在。
  • HMODULEvoid* ,一种无类型类型,与 unique_ptr 集成时可能会出现问题?

如果我错了,请在评论中纠正我。

最佳答案

根据 this page ,HMODULE是HINSTANCE,HINSTANCE是HANDLE,HANDLE是PVOID,PVOID是void *。这意味着 HMODULE 是指针类型。所以以下应该有效:

std::unique_ptr<std::remove_pointer_t<HMODULE>, BOOL(*)(HMODULE)> theDll(LoadLibrary("My.dll"), FreeLibrary);

关于c++ - 是否可以使用 std::unique_ptr 来管理 DLL 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31692871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com