模拟实现定制删除器的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"));
}通过定制删除器来避免内存回收时的问题。
本文介绍C++中智能指针SharedPtr的实现,并利用仿函数作为删除器以解决new/delete等操作符的匹配问题。通过具体示例展示了如何为不同的内存分配方式定制相应的删除策略。

被折叠的 条评论
为什么被折叠?



