1. 程式人生 > >智慧指標的簡單實現-SharePtr

智慧指標的簡單實現-SharePtr

SharePtr的簡單實現

#include <iostream>
#include<string>
using namespace std;
#pragma warning(disable:4996)
template<class T, class Del>
class SharePtr
{
public:
    SharePtr(T* ptr) //建構函式
        :_ptr(ptr), _ref(new int(1))
    {
        cout << "SharePtr(T* ptr) " << endl;
    }
    SharePtr(SharePtr& cp)//拷貝建構函式
{ cout << "SharePtr(SharePtr& cp)" << endl; _ptr = cp._ptr; _ref = cp._ref; (*_ref)++; } ~SharePtr()//解構函式 { Release(); } void Release() { if (--(*_ref) == 0) { delete _ref; _del(_ptr); } } T* operator
->()//->操作符過載 { return _ptr; } T& operator*()//解引用操作符過載 { return *_ptr; } SharePtr& operator=(SharePtr& sp)//賦值操作符過載 { if (_ptr != sp._ptr) { Release(); _ptr = sp._ptr; _ref = sp._ref; (*_ref)++; } return
*this; } private: T* _ptr; int* _ref; Del _del;//這是一個物件函式決定著析構時以什麼方式釋放申請的空間 }; //以上為class SharePtr的內容 template<class T> struct Delete { void operator()(T* ptr) { cout << "delete" << endl; delete ptr; } }; template<class T> struct DeleteArr { void operator()(T* ptr) { cout << "delete[]" << endl; delete[] ptr; } }; template<class T> struct Free { void operator()(T* ptr) { cout << "free" << endl; free(ptr); } }; template<class T> struct Close { void operator()(T* ptr) { cout << "close" << endl; if (ptr != NULL) { fclose(ptr); } } }; //以上為物件函式 //下面為主函式程式碼 int main() { SharePtr<int, Delete<int>> p1(new int(10)); SharePtr<int, Delete<int>> p2(p1); SharePtr<string, DeleteArr<string>> p3(new string[3]); SharePtr<string, DeleteArr<string>> p4(p3); SharePtr<string, DeleteArr<string>> p5(p4); SharePtr<int, Delete<int>> p6(new int(20)); SharePtr<int, Free<int>> p7 = (int*)malloc(sizeof(int)); SharePtr<FILE, Close<FILE>> p8 = fopen("FILENAME", "r"); cout << *p1 << "," << *p2 << endl; p2 = p6; *p1 = 15; cout << *p1 << "," << *p2 << endl; return 0; }

結果為
這裡寫圖片描述