智能指针包装CoTaskMemAlloc和CoTaskMemFree



我目前正在C++开发一个跨平台的共享库,遇到了跨模块边界的内存管理问题,即在调用它的过程中释放我的共享库中分配的内存。

我已经列出了可能的解决方案 - 使用 C 接口,仅使用纯抽象接口并使用CoTaskMemAlloc/CoTaskMemFree,后者似乎更容易。

有没有人尝试过让标准的智能指针与这两种方法一起工作?是否有任何智能指针实现使用这些方法,以便可以跨 DLL 边界共享智能指针?

尝试查看: CComHeapPtr CHeapPtr

您可以使用CComHeapPtr(如此处建议(:

例:

#include <atlbase.h>
....
CComHeapPtr<WCHAR> pszPath;
if (SHGetKnownFolderPath(FOLDERID_ProgramData, 0, nullptr, &pszPath) != S_OK)
return {};
return std::wstring(pszPath);

而不是:

PWSTR pszPath;
if (SHGetKnownFolderPath(FOLDERID_ProgramData, 0, nullptr, &pszPath) != S_OK)
return {};
std::wstring ret = pszPath;
CoTaskMemFree(pszPath);
return ret;

过去,我尝试过类似的东西。

template<typename T>
struct freeArrFunctor
{
void operator()(T* arr)
{
free(arr);
arr = NULL;
}
};
template<typename T>
using unique_array_ptr = std::unique_ptr<T, freeArrFunctor<T>>;
template<typename T>
inline unique_array_ptr<T> make_unique_array_ptr (const size_t Nbyte)
{
return unique_array_ptr<T>(static_cast<T*>(malloc(Nbyte)));
}

首先,你必须声明你自己的删除器的工作方式(这里我使用了 c 'free((' 函数(。 并且 use 是指向唯一指针的自定义删除器。

您可以查看本主题,其中有很多自定义使用唯一指针的良好示例。

因此,根据上面的示例,您可以创建一个派生的智能指针,如下所示:

cross_unique_ptr<T>,您将能够定义自己的make函数(如果需要,可以直接构造指针(,还可以定义要提供给该新智能指针的cross_deleter_functor

相关内容

  • 没有找到相关文章

最新更新