zoukankan      html  css  js  c++  java
  • C++11:21通过智能指针管理第三方库分配的内存

    21、通过智能指针管理第三方库分配的内存

    0、课前秀

    • 第三方库分配的内存一般需要通过第三方库提供的释放接口才能释放,由于第三方库返回的指针一般都是原始指针,在用完之后没有调用第三方库的释放接口,就很容易造成内存泄露。

    1、示例

    • 第三方库的释放(可能会存放跟new,delete一样,忘记释放或走不到分支)
    void* p = GetHandle()->Create();
    //do something...
    GetHandle()->Release(p);
    
    • 用智能指针暂时解决
    void* p = GetHandle()->Create();
    std::shared_ptr<void> sp(p,[this](void*p){GetHandle()->Release(p);});
    
    • 抽象成公共函数
    std::shared_ptr<void> Guard(void* p)
    {
        return std::shared_ptr<void> sp(p,[this](void* p){GetHandle()->Release(p);});
    }
    
    void* p = GetHandle()->Create();
    auto sp = Guard(p);
    //do something...
    
    • 用宏解决
    #define GUARD(P) std::shared_ptr<void> p##p(p,[](void* p){GetHandle()->Release(p);});
    
    void *p = GetHandle()->Create();
    GUARD(p);//安全
    
    • 用unique_ptr来管理第三方内存
    #define GUARD(P) std::unique_ptr<void,void(*)(int *) > p##p(p,[](void* p){GetHandle()->Release(p);});
    

    ReadMe

    • 20200525下班后整理,管理第三方本质上的思路还是管理库原生的呗。
  • 相关阅读:
    CentOS7.4安装Docker
    责任链模式
    策略模式
    状态模式
    解释器模式
    备忘录模式
    中介者模式
    观察者模式
    迭代器模式
    private、default、protected和public的作用域
  • 原文地址:https://www.cnblogs.com/fewolflion/p/12960316.html
Copyright © 2011-2022 走看看