ttp://www.xwwzsj.com/weixin#item4">小程序开发
  • 案例展示
  • 新闻资讯
  • 解决方案
  • 瑞达杰昌建站
  • 联系我们
  • 客户专线:135-1821-9792

    服务热线:028-86922220

    我们专注于高端品牌网站创意设计与开发

  • 3种智能指针

    • 出现智能指针的原因

      10年积累的成都网站设计、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有上海免费网站建设让你可以放心的选择与我们合作。

         用智能指针,把申请内存的工作都在接口内部实现并加以限制,把释放内存的工作交给智能指针。
    • 常见的智能指针

         1.你知道智能指针吗?智能指针的原理。
         2.常用的智能指针。
         3.智能指针的实现。

    1答案:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,

         2, 最常用的智能指针: 

          1)std::auto_ptr,有很多问题。 不支持复制(拷贝构造函数)和赋值(operator =),但复制或赋值的时候不会提示出错。因为不能被复制,所以不能被放入容器中。

         2) C++11引入的unique_ptr(scoped_ptr), 也不支持复制和赋值,但比auto_ptr好,直接赋值会编译出错。实在想赋值的话,需要使用:std::move。

          例如:

              std::unique_ptr p1(new int(5));
              std::unique_ptr p2 = p1; // 编译会出错
              std::unique_ptr p3 = std::move(p1); // 转移所有权, 现在那块内存归p3所有, p1成为无效的指针.

          3) C++11或boost的shared_ptr,基于引用计数的智能指针。可随意赋值,直到内存的引用计数为0的时候这个内存会被释放。

          4)C++11或boost的weak_ptr,弱引用。 引用计数有一个问题就是互相引用形成环,这样两个指针指向的内存都无法释放。需要手动打破循环引用或使用weak_ptr。顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查weak_ptr是否为空指针。

    • 智能指针的实现

    • Autoptr

      代码:

    #pragma once
    
    template
    class Autoptr
    {
    public:
    	Autoptr()
    		:_ptr(NULL)
    	{}
    	Autoptr(T *ptr)
    		:_ptr(ptr)
    	{}
    	Autoptr(Autoptr& a)
    		:_ptr(a._ptr)
    	{
    		delete _ptr;
    		a._ptr = NULL;
    	}
    	~Autoptr()
    	{
    		if (_ptr)
    		{
    			delete _ptr;
    			_ptr = NULL;
    		}
    	}
    	Autoptr& operator=(Autoptr&a)
    	{
    		if (this != &a)
    		{
    			delete _ptr;
    			_ptr = a._ptr;
    			a._ptr = NULL;
    		}
    		return *this;
    	}
    	T& operator*()
    	{
    		return *_ptr;
    	}
    	T* Getptr()
    	{
    		return _ptr;
    	}
    
    protected:
    	T *_ptr;
    };
    void Autoptrtest()
    {
    	int *a = new int(5);
    	Autoptr ap1(a);
    	cout << *ap1 << endl;
    	cout << ap1.Getptr() << endl;
    	Autoptr ap2(ap1);
    	cout << *ap2 << endl;
    	cout << ap2.Getptr() << endl;
    	cout << ap1.Getptr() << endl;
    	Autoptr ap3;
    	ap3 = ap2;
    	cout << *ap3 << endl;
    	cout << ap3.Getptr() << endl;
    	cout << ap2.Getptr() << endl;
    }
    • Scopedptr

       代码:

    #pragma once
    template
    class Scopedptr
    {
    public:
    	Scopedptr()
    		:_ptr(NULL)
    	{}
    	Scopedptr(T *data)
    		:_ptr(data)
    	{}
    	~Scopedptr()
    	{
    		if (_ptr)
    		{
    			delete _ptr;
    			_ptr = NULL;
    		}
    	}
    	T& operator*()
    	{
    		return *_ptr;
    	}
    	T* Getptr()
    	{
    		return _ptr;
    	}
    protected://加上protected可以防止使用者在类之外定义拷贝构造和运算符的重载函数 
    	Scopedptr(const Scopedptr&sp); //不让使用者使用拷贝,可以防止拷贝,所以只声明不定义
    	Scopedptr& operator=(const Scopedptr&sp);
    private:
    	T *_ptr;
    };
    void Scopedptrtest()
    {
    	int *a = new int(5);
    	Scopedptr ap1(a);
    	cout << *ap1 << endl;
    	cout << ap1.Getptr() << endl;
    	/*Scopedptr ap2(ap1);
    	cout << *ap2 << endl;
    	Scopedptr ap3;
    	ap3 = ap2;
    	cout << *ap3 << endl;
    	cout << ap3.Getptr() << endl;
    	cout << ap2.Getptr() << endl;*/
    }
    • Sharedptr

      代码:

    #pragma once
    template
    class Sharedptr
    {
    public:
    	Sharedptr()
    		:_ptr(NULL)
    		, _pcount(new int(1))
    	{}
    	Sharedptr(T *ptr)
    		:_ptr(ptr)
    		, _pcount(new int(1))
    	{}
    	Sharedptr(const Sharedptr& sp)
    		:_ptr(sp._ptr)
    		, _pcount(sp._pcount)
    	{
    		++(*_pcount);
    	}
    	~Sharedptr()
    	{
    		if (_ptr)
    		{
    			if (--(*_pcount)==0)
    			{
    				delete _ptr;
    				delete _pcount;
    				_ptr = NULL;
    				_pcount = NULL;
    			}
    			_ptr = NULL;
    		}
    	}
    	Sharedptr& operator=(const Sharedptr &sp)
    	{
    		if (this != &sp)
    		{
    			if (--(*_pcount) == 0)
    			{
    				delete _ptr;
    				delete _pcount;
    				_ptr = NULL;
    				_pcount = NULL;
    			}
    			_ptr = sp._ptr;
    			_pcount = sp._pcount;
    			++(*_pcount);
    		}
    		return *this;
    	}
    private:
    	T* _ptr;
    	int *_pcount;
    };
    void Sharedptrtest()
    {
    	int *a = new int(5);
    	Sharedptr ap1(a);
    	Sharedptr ap2(ap1);
    	Sharedptr ap3;
    	ap3 = ap2;
    }

    本文名称:3种智能指针
    网站URL:http://www.xwwzsj.com/article/igpcej.html

    其他资讯

    售后响应及时

    7×24小时客服热线

    数据备份

    更安全、更高效、更稳定

    价格公道精准

    项目经理精准报价不弄虚作假

    合作无风险

    重合同讲信誉,无效全额退款