C++ shared_ptr自定义删除器类

本文介绍了一种使用C++智能指针时自定义删除器的方法,特别是针对自定义内存池的释放需求。通过创建CustomerDeleter类和CDeleter类,实现了在释放内存时传递额外参数的功能,确保内存池能正确回收指定大小的缓冲区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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自定义删除器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值