C++ shared_ptr自定义删除器类

1、智能指针删除器类

因为用自己实现的内存池在释放内存时需要buffer的大小才可以,用函数和labda表达式不知道如何实现,所以用删除器类实现自定义的智能指针删除器。

/* 智能指针删除器类 */
class CustomerDeleter
{
public:    
      CustomerDeleter(shared_ptr<RingMempool> MemPool, size_t buf_size):m_MemPool(MemPool),  m_BufSize(buf_size)    {            }    

    void operator()(char* buf)   
    {        
       printf("Free mempool[%p] buffer success \n", m_MemPool.get());       
       m_MemPool->Free(buf, m_BufSize);   
    }    
    
private:   
    shared_ptr<RingMempool> m_MemPool;    
    size_t m_BufSize;
};

class tmp1
{
public:    
    tmp1() {}   
    ~tmp1() {}   
    void Push(shared_ptr<char> buf) { Qbuf.push(buf); }   
    shared_ptr<char> pop() { shared_ptr<char> buf = Qbuf.front(); Qbuf.pop(); return buf; }   
    queue<shared_ptr<char> > Qbuf;
};
    
class CDeleter
{
public:    
      CDeleter(int buf_size, int num):m_buf_size(buf_size), m_num(num)   
      {     printf("111 buf_size[%d] num[%d]\n", buf_size, num);    }   
 
      void operator()(char* X)   
      {        printf("222 [%p] buf_size[%d] num[%d]\n", X, m_buf_size, m_num);        delete[] X;    }
   
private:   
      int m_buf_size = 0;    
      int m_num = 0;
 };
    
int main()
{
#if 0    
   char *tmpBuf =  (char *)m_VideoMemPool->Calloc(m_UsedVideoFrameBufSize);    
    if(tmpBuf == NULL)   
     {     
         printf("11m_mem_pool[%p]->Calloc Fail size[%d] for video channel \n", m_VideoMemPool.get(), m_UsedVideoFrameBufSize);        
         return -1;    
     }         
              
     /* 传入使用的内存池及申请的内存块的大小,自己实现的内存池销毁时需要用到 */       
     std::shared_ptr<char> ds((char*)tmpBuf, CustomerDeleter(m_VideoMemPool, m_UsedVideoFrameBufSize));
 #endif   
      
     {           
       shared_ptr<char>buf1 = shared_ptr<char>(new char[100], CDeleter(100, 1));               
       shared_ptr<char>buf2 = shared_ptr<char>(new char[80], CDeleter(80, 2));            
       shared_ptr<char>buf3 = shared_ptr<char>(new char[80], CDeleter(80, 3));            
       T1.Push(buf1);            
       T1.Push(buf2);            
       T1.Push(buf3);    
     }        
     
      T1.pop();        
      T1.pop();        
      T1.pop();   
      return 0;
}

输出
在这里插入图片描述

2、参考:

C++ 智能指针shared_ptr/unique_ptr自定义删除器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中的 `shared_ptr` 是一个智能指针,用于管理动态分配的对象。它是 C++11 引入的一个特性,位于 `<memory>` 头文件中。 `shared_ptr` 可以用来共享一个对象的所有权。它会记录有多少个 `shared_ptr` 共享同一个对象,并且当所有的 `shared_ptr` 都不再使用该对象时,会自动释放对象的内存。 使用 `shared_ptr` 的语法如下所示: ```cpp #include <memory> int main() { // 创建 shared_ptr std::shared_ptr<int> ptr1 = std::make_shared<int>(42); // 共享对象的所有权 std::shared_ptr<int> ptr2 = ptr1; // 使用 shared_ptr 操作对象 *ptr1 = 100; std::cout << *ptr2 << std::endl; // 输出:100 // 释放对象内存 ptr1.reset(); std::cout << *ptr2 << std::endl; // 输出:100 return 0; } ``` 在上述示例中,我们首先创建了一个 `shared_ptr`,并使用 `make_shared` 函数动态分配一个整数对象,并将其初始化为 42。然后我们创建了另一个 `shared_ptr`,并将其指向第一个 `shared_ptr` 所管理的对象。通过这种方式,两个 `shared_ptr` 共享同一个整数对象。我们可以通过任意一个 `shared_ptr` 来访问和操作该对象,并且当两个 `shared_ptr` 都不再使用该对象时,会自动释放对象的内存。 需要注意的是,`shared_ptr` 使用引用计数的方式来管理对象的生命周期。当引用计数变为零时,即没有任何 `shared_ptr` 指向该对象时,会自动调用对象的析构函数来销毁对象。这种智能指针可以避免常见的内存泄漏问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值