模拟实现定制删除器的SharedPtr

模拟实现定制删除器的SharedPtr

上篇博客里介绍了三种智能指针,模拟了三种智能指针的简单实现。
这里继续介绍智能指针SharedPtr,利用仿函数定制删除器
利用仿函数来解决C++中出现的new 、delete等匹配问题
在C++中有关内存处理方面的操作符或函数有
     new----------delete                 malloc-----------free                       fopen-----------fclose                    lock----------unlock
#include 
    
    
     
     
template
     
     
      
      
class Delete
{
public:
	void operator()(T* ptr)
	{
		cout << "Delete" << endl;
		delete ptr;
		ptr = NULL;
	}
};
template
      
      
       
       
class DeleteArray
{
public:
	void operator()(T* ptr)
	{
		cout << "DeleteArray" << endl;
		delete[] ptr;
	}
};
template
       
       
        
        
class Free
{
public:
	void operator()(T* ptr)
	{
		cout << "Free" << endl;
		free(ptr);
	}
};
template
        
        
          class Fclose { public: void operator()(T*& ptr) { cout << "Fclose" << endl; fclose(ptr); ptr = NULL; } }; template 
         
           > class SharedPtr { public: SharedPtr(T* ptr) :_ptr(ptr) , _refCount(new int(1)) {} ~SharedPtr() { Release(); } T& operator*() { return *_ptr; } T*operator->() { return _ptr; } inline void Release() { if (--*_refCount==0) { _del(_ptr); delete _refCount; _refCount = NULL; } } SharedPtr(const SharedPtr 
          
            & sp) :_ptr(sp._ptr) , _refCount(sp._refCount) { (*_refCount)++; } SharedPtr 
           
             & operator=(const SharedPtr 
            
              & sp) { if (_ptr != sp._ptr) { Release(); _ptr = sp._ptr; _refCount = sp._refCount; (*_refCount)++; } return *this; } protected: T* _ptr; int* _refCount; Del _del; }; void TestSharedPtr() { SharedPtr 
             
               ap1(new int(10)); SharedPtr 
              
                ap2 ( ap1); SharedPtr 
               
                 ap3(new int(20)); ap2=ap3; SharedPtr 
                
                  > sp2(fopen("test.txt", "rb")); } 
                 
                
               
              
             
            
           
          
        
       
       
      
      
     
     
    
    

通过定制删除器来避免内存回收时的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值