【问题标题】:Smart pointer wrapping CoTaskMemAlloc and CoTaskMemFree包装 CoTaskMemAlloc 和 CoTaskMemFree 的智能指针
【发布时间】:2019-09-24 13:59:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ memory-management dll cross-platform smart-pointers


    【解决方案1】:

    过去,我尝试过类似的方法。

        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()' 函数)。并用作唯一指针的自定义删除器。

    你可以看看这个topic,那里有很多自定义使用唯一指针的好例子。

    所以基于上面的例子,你可以制作一个派生的智能指针,比如:

    cross_unique_ptr&lt;T&gt; 您可以在其中定义自己的 make 函数(如果需要,则直接构造指针),还可以定义 cross_deleter_functor 以提供给新的智能指针。

    【讨论】:

    • 我的意思是重载智能指针以始终使用这两种方法,但我很欣赏你的想法。
    • 我不认为重载智能指针是个好主意,你应该更喜欢wrap他们,正如你的标题所暗示的那样。
    • 这意味着我需要为需要存储指针的每种类型进行包装。工作量很大。
    • 您有两个选择。您可以为每种类型重新定义::std::default_delete&lt;YourType&gt;::std::make_unique&lt;YourType&gt;,如here 所示,或者您可以创建一个更新的对象,如cross_unique_ptr&lt;T&gt;(如我在回答中所示)并使用它而不是std::unique_ptr&lt;T&gt;
    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多