【发布时间】:2015-10-17 13:40:25
【问题描述】:
我现在正在赶上我当前项目中的 C++ 11/14 内容。我在使用unique_ptr/shared_ptr 时遇到问题,API 函数通过指针将资源作为输出参数返回。
我们以DsGetDcName(..., __out PDOMAIN_CONTROLLER_INFO* ppDCI) 为例。
在 c++11 之前,有一种使用 Windows API 的广泛模式。我会有一个 RIIA 类,它包含 PDOMAIN_CONTROLLER_INFO,在析构函数中调用 NetApiBufferFree,并拥有 PDOMAIN_CONTROLLER_INFO* operator&(),以便我可以编写:
info_ptr spInfo;
DsGetDcName(..., &spInfo);
现在有了 C++ 11/14,我看到很多文章提倡 unique_ptr/shared_ptr 使用自定义删除器以适当的方式释放资源。当资源作为 r 值从函数返回时,它确实很有效(LoadLibrary 就是一个很好的例子)。
我发现的一个解决方案是在 API 调用之后将原始指针附加到智能指针:
PDOMAIN_CONTROLLER_INFO pDCI = nullptr;
DsGetDcName(..., &pDCI);
std::unique_ptr<DOMAIN_CONTROLLER_INFO, decltype(&NetApiBufferFree)> spInfo(pDCI, &NetApiBufferFree);
但是,这不是我喜欢的方式。据我了解,新的智能指针并不是为输出参数而设计的,可能是因为“安全第一”的方法。
真的可以在这里做点什么吗?也许某种函子类作为输出参数代理,所以我可以写DsGetDcName(..., &out_param(spInfo))?
【问题讨论】:
-
std::unique_ptr的全部目的是将RAII 应用于指针。如果你已经有这样的设置,我认为你不应该改变。 -
问题在于
std::unique_ptr没有提供覆盖的operator&来访问内部指针的地址,因此可以将其传递给API。
标签: pointers winapi c++11 smart-pointers c++14