c++ 智能指针 share_ptr 简单实现

#include <pthread.h>
#pragma comment(lib,"x86/pthreadVC2.lib")
using namespace std;

template <typename T>
class Shared_ptr {
public:
    Shared_ptr(){
        count = 0;
        _ptr = (T*)0;
        pthread_mutex_init(&mutex, NULL);
    }

    Shared_ptr(T* p){
        count = new int(1);
        _ptr = p;
        pthread_mutex_init(&mutex, NULL);
    }

    Shared_ptr(Shared_ptr<T>& other){
        pthread_mutex_init(&mutex, NULL);

        pthread_mutex_lock(&mutex);
        count = &(++ *other.count);
        _ptr = other._ptr;
        pthread_mutex_unlock(&mutex);
    }

    T* operator->(){ 
        return _ptr; 
    }

    T& operator*() {
        return *_ptr;
    }

    Shared_ptr<T>& operator=(Shared_ptr<T>& other) {
        if (this == &other){
            return *this;
        }

        ++(*other.count);

        pthread_mutex_lock(&mutex);
        if (this->_ptr && 0 == --(*this->count)){
            delete count;
            delete _ptr;
            cout << "delete ptr =" << endl;
        }

        this->_ptr = other._ptr;
        this->count = other.count;
        pthread_mutex_unlock(&mutex);

        return *this;
    }

    ~Shared_ptr(){
        if (_ptr && --(*count) == 0){
            pthread_mutex_lock(&mutex);
            delete count;
            delete _ptr;
            pthread_mutex_unlock(&mutex);
            cout << "Delete ptr" << endl;
        }
    }
    int getRef() { 
        return *count;
    }
private:
    int* count;
    T* _ptr;
    pthread_mutex_t mutex;
};

int main(int argc, const char * argv[])
{
    Shared_ptr<string> pstr(new string("abc"));
    cout << "Pstr:" << pstr.getRef() << " " << *pstr << endl;

    Shared_ptr<string> pstr2(pstr);
    cout << "Pstr:"  << pstr.getRef()  << " "<< *pstr << endl;
    cout << "pstr2:" << pstr2.getRef() << " "<< *pstr2 << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智能指针share_ptrC++11标准库中的一种用于管理动态分配内存的智能指针。它能够自动管理资源,在不需要时释放内存,防止内存泄漏。然而,在实际代码中,我们常常会遇到相互引用的情况,即两个或多个对象之间产生循环引用,导致内存泄漏。这种情况对于传统的裸指针来说是无法解决的,但对于智能指针share_ptr来说,则可以通过以下方法解决: 1.使用weak_ptr:在循环引用的情况下,一个对象可以通过weak_ptr来共享相应的资源,而不会增加资源的引用计数。因此,在处理相互引用问题时,可以使用weak_ptr来打破循环引用,避免内存泄漏。 2.使用单独的管理对象:在某些情况下,多个对象之间的相互引用较为复杂,使用weak_ptr不能完全解决问题,例如多层嵌套的相互引用。这时候,可以引入一个额外的管理对象,用于管理这些对象之间的关系,从而减少相互引用的复杂度。 3.使用裸指针代替智能指针:虽然智能指针share_ptr可以很好地管理内存,但在某些场景下,使用裸指针可能会更为简单、清晰。例如,在处理循环引用时,可以使用裸指针进行判断,然后手动删除内存。 综上所述,智能指针share_ptrC++中非常有用的工具,在避免内存泄漏方面发挥了很大的作用。虽然在处理相互引用时可能会遇到一些麻烦,但使用上述方法可以很好地解决问题,保证代码质量和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值