玩一玩shared_ptr吧~

智能指针的作用

c++程序在书写的时候难免会有很多对内存的使用,其中对于在栈空间中的内存,在程序结束后,自动释放,但是对于堆内存来说,如果不及时释放,这会对内存造成一定的灾难,对于堆内存的使用来说,对堆得申请和释放,都需要我们自己来动手(在c++11之前),但是在c++11之后,引出了智能指针的概念,对于一个在堆内存的使用上,有了极大的简洁。使用一般的指针,对于一个刚入门的程序员而言,很容易乱用,忘记释放,二次释放等。但使用智能指针之后,便能更好的管理堆内存。当然在如今,计算机行业发展甚好的今天,早就有人开发出了对于堆内存管理的堆管理器,它能很好的帮助程序员检测内存泄漏的地方,在程序调试期便能够检测出内存泄漏的地方。(向偶像致敬)

对于智能指针内部原理的理解

智能指针利用了一种机制(RAII),资源获取即初始化,对于检验一个是否合格的c++工程师,就要看他是否真实理解RAII机制。RAII机制,对一般的指针进行封装,实际上智能指针就是一个实例化的对象而已,但是其行为表现,显得是一个指针。当然,它也是线程安全的。

shared_ptr的使用

1,初始化。智能指针是一个类,而且是一个模板类,可以指定类型,传入指针,通过其内部constructor初始化。不能讲一个指针赋值给一个智能指针,记住,智能指针是一个类,而不是一个指针,其行为表现是指针而已。
2,拷贝和赋值
拷贝,引用计数器加1,赋值,引用计数器减一。当引用计数器为0时,自动释放内存。
3,实现:

#include
#include
#include
using namespace std;

template
class share_pointer
{
    public:
        share_pointer(T* ptr):_ptr(ptr),reference(new int(1)),pmuxte(new mutex){}

        ~share_pointer()
        {  
            relese();
        }

        share_pointer(const share_pointer&sp):_ptr(sp._ptr),reference(sp.reference),pmuxte(sp.pmutex)
        { 
            addcount();
        }

        share_pointer& operator= (const share_pointer&sp)
        {
            if (this->_ptr != sp._ptr)
            { 
                relese();
                this->_ptr = sp._ptr;
                this->reference = sp.reference;
                this->pmutex = sp.pmutex;
                this->addcount();
            }
            return *this;
        }

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

        T& operator-> ()
        {
            return this->_ptr;
        }
        
        int usecount()
        {
            return *(this->reference);
        }

        T* get()
        {
            return this->_ptr;
        }

        void addcount()
        {
            this->pmutex->lock();
            ++(*this->reference));
            this->pmutex->unlock();
        }
  private:
        int* reference;
        T* _ptr;
        mutex* pmutex;
        
        void relese()
        {
            bool deleteflage = false;
            this->pmutex->lock();
            if ( 0 == (--(*(this->reference))) )
            {
                delete this->_ptr;
                delete this->reference;
                deleteflag = true;
            }
            this->pmutex->unlock();
            if ( deleteflag == true)
            {
                delete this->pmutex;
            }
        }
};

int mian()
{
    share_pointert1(new int(10));
    share_pointert2(t1);
    *t2 = 20;
    cout<t3(new int(200));
    t2 = t3;
    cout<

你可能感兴趣的:(玩一玩shared_ptr吧~)