Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
智能指针包装CoTaskMemAlloc和CoTaskMemFree 我目前正在开发C++中的跨平台共享库,并且遇到了跨模块边界的内存管理问题,即在调用它的进程中释放分配给我的共享库的内存。_C++_Memory Management_Dll_Cross Platform_Smart Pointers - Fatal编程技术网

智能指针包装CoTaskMemAlloc和CoTaskMemFree 我目前正在开发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

我已经列出了可能的解决方案-使用C接口,只使用纯抽象接口和使用
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