C++定制删除器

    xiaoxiao2021-03-25  14

    上一篇博客提到的智能指针采通过引用计数我们能解决多次释放同一块内存空间的问题,并且和之间直接移交管理权的方式比较这种方式更加灵活安全。但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和new,malloc,fopen的管理空间匹配,我们需要定制删除器

    #include<iostream> #include<stdlib.h> using namespace std; template<class T> struct Free//创建与malloc匹配的删除器 { void operator()(T* pStr) { free(pStr); cout << "Free()" << endl; } }; template<class T> struct Del//创建与new匹配的删除器 { void operator()(T* pStr) { delete pStr; pStr = NULL; cout << "Del()" << endl; } }; struct Fclose//创建与fopen匹配的删除器 { void operator()(FILE* pStr) { fclose(pStr); cout << "Fclose()" << endl; } }; template<class T, class Delete= Del<T>>第二个参数则是模板类参数 class SharedPtr { public: SharedPtr(T* pStr = NULL, Delete del = Del<T>())//默认使用Del删除 :_pStr(pStr) ,_pCount(new int(1)) ,_del(del) { } SharedPtr(SharedPtr& sp)//拷贝构造函数 :_pStr(sp._pStr) ,_pCount(sp._pCount) { ++(*_pCount); } SharedPtr<T,Del<T>>& operator=(SharedPtr& sp)//分三种情况 { if (this != &sp&&_pStr != sp._pStr)//判断是不是自己给自己赋值这种方式更好 { if (_pStr != NULL&&--(*_pCount) == 0) { Del(); } ++(*sp._pCount); _pStr = sp._pStr; _pCount = sp._pCount; } return *this; } int GetCount() { return *_pCount; } void Release() { _del(_pStr); delete _pCount; } ~SharedPtr() { if ( --(*_pCount)== 0) { Release(); } } private: int *_pCount; T* _pStr; Delete _del; }; void FunTest() { /*SharedPtr<int> sp(new int); cout << sp.GetCount() << endl; SharedPtr<int> sp1(sp); cout << sp.GetCount() << endl; SharedPtr<int> sp2(sp); cout << sp.GetCount() << endl; SharedPtr<int> sp3(new int); sp = sp3; cout << sp.GetCount() << endl; cout << sp1.GetCount() << endl;*/ SharedPtr<int>sp(new int); SharedPtr<int,Free<int>>sp1((int*)malloc(sizeof(int)), Free<int>()); } int main() { FunTest(); system("pause"); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-200358.html

    最新回复(0)