智能指针包装CoTaskMemAlloc和CoTaskMemFree 我目前正在开发C++中的跨平台共享库,并且遇到了跨模块边界的内存管理问题,即在调用它的进程中释放分配给我的共享库的内存。
我已经列出了可能的解决方案-使用C接口,只使用纯抽象接口和使用智能指针包装CoTaskMemAlloc和CoTaskMemFree 我目前正在开发C++中的跨平台共享库,并且遇到了跨模块边界的内存管理问题,即在调用它的进程中释放分配给我的共享库的内存。,c++,memory-management,dll,cross-platform,smart-pointers,C++,Memory Management,Dll,Cross Platform,Smart Pointers,我已经列出了可能的解决方案-使用C接口,只使用纯抽象接口和使用CoTaskMemAlloc/CoTaskMemFree,后者似乎更简单 有人试过让标准智能指针使用这两种方法吗?有没有使用这些方法的智能指针实现可以跨DLL边界共享智能指针?过去,我尝试过类似的方法 template<typename T> struct freeArrFunctor { void operator()(T* arr) { f
CoTaskMemAlloc
/CoTaskMemFree
,后者似乎更简单
有人试过让标准智能指针使用这两种方法吗?有没有使用这些方法的智能指针实现可以跨DLL边界共享智能指针?过去,我尝试过类似的方法
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)));
}
模板
结构自由函子
{
void运算符()(T*arr)
{
免费(arr);
arr=NULL;
}
};
模板
使用unique_array_ptr=std::unique_ptr;
模板
内联唯一数组ptr生成唯一数组ptr(常量大小)
{
返回唯一的数组ptr(静态施法(malloc(Nbyte));
}
首先,您必须声明自己的deleter的工作方式(这里我使用了c'free()'函数)。并将其用作唯一指针的自定义删除器
您可以看看这里,这里有很多自定义使用唯一指针的好例子
因此,根据上面的示例,您可以制作一个派生的智能指针,如:
cross\u unique\u ptr
在这里,您可以定义自己的make函数(如果您愿意,也可以直接构造指针),还可以定义cross\u deleter\u functor
以提供给新的智能指针。我的意思是重载智能指针以始终使用这两种方法,但是我很欣赏你的想法。我认为让智能指针过载不是一个好主意,你应该按照标题的建议包装它们。这意味着我需要为我需要存储指针的每种类型都包装一个。这是一个很大的工作。你有两个选择。您可以为每种类型重新定义::std::default_delete
和::std::make_unique
,如图所示,也可以创建一个更新的对象,如cross_unique_ptr
(如我在回答中所示),并使用它代替std::unique_ptr