面試常見——手寫智慧指標
阿新 • • 發佈:2022-05-27
template <class T> class SharedPtr { public: SharedPtr(T* ptr = nullptr) : _ptr(ptr) , _pRefCount(new int(1)) , _pMutex(new mutex) {} ~SharedPtr() { Release(); } SharedPtr(const SharedPtr<T>& sp) : _ptr(sp._ptr) , _pRefCount(sp._pRefCount) , _pMutex(sp._pMutex) { AddRefCount(); }// 賦值 SharedPtr<T>& operator=(const SharedPtr<T>& sp) { if (_ptr != sp._ptr) { // 釋放管理的舊資源 Release(); // 共享管理新物件的資源,並增加引用計數 _ptr = sp._ptr; _pRefCount = sp._pRefCount; _pMutex = sp._pMutex; AddRefCount(); }return *this; } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } int UseCount() { return *_pRefCount; } T* Get() { return _ptr; } void AddRefCount() { // 加鎖或者使用加1的原子操作 _pMutex->lock(); ++(*_pRefCount); _pMutex->unlock(); } private: void Release() { bool deleteflag = false; // 引用計數減1,如果減到0,則釋放資源 _pMutex->lock(); if (--(*_pRefCount) == 0) { delete _ptr; delete _pRefCount; deleteflag = true; } _pMutex->unlock(); if (deleteflag == true) delete _pMutex; } private: int* _pRefCount; // 引用計數 T* _ptr; // 指向管理資源的指標 mutex* _pMutex; // 互斥鎖 };
參考:https://blog.csdn.net/qq_56663697/article/details/123964427