1. 程式人生 > 其它 >面試常見——手寫智慧指標

面試常見——手寫智慧指標

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