模拟实现定制删除器的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")); }
通过定制删除器来避免内存回收时的问题。