智能指针-----实现

unique_ptr:

  https://blog.csdn.net/afei__/article/details/80670283

 

 

最简单的智能指针实现:

#include <numeric>
#include <array>
#include <cstring>
#include <cstdio>
#include <windows.h>
using namespace  std;
template <class T>
class smartPoint
{
private:
    T* m_pointer;
public:
    smartPoint(T*pp = NULL){ m_pointer = pp; }
    T* operator->(){ return m_pointer; }
    T&  operator*(){ return *m_pointer; }
    ~smartPoint(){ delete m_pointer; }
    smartPoint(const smartPoint<T>& obj)
{
m_pointer = obj.m_pointer; const_cast<smartPoint<T>& >(obj).m_pointer = NULL;
  }
smartPoint
<T>& operator=(const smartPoint<T>& obj) { if (obj != this) { delete m_pointer;
       m_pointer=obj.m_pointer; const_cast
<smartPoint<T>&>(obj).m_pointer = NULL; } return *this; } } };

 

share_ptr:https://blog.csdn.net/k346k346/article/details/81478223

实现参考:https://www.cnblogs.com/cycxtz/p/4742970.html

 

#include <algorithm>
#include <iostream>
#include <functional>
#include <vector>
#include <numeric>
#include <array>
#include <cstring>
#include <cstdio>
#include <windows.h>
using namespace  std;
class Point
{
private:
	int x, y;
public:
	Point(int xVal = 0, int yVal = 0) :x(xVal), y(yVal) { }
	int getX() const { return x; }
	int getY() const { return y; }
	void setX(int xVal) { x = xVal; }
	void setY(int yVal) { y = yVal; }
};

template<class T>
class share_ptr{
private:
	int* count;//用于引用计数
	T* data;
public:
	share_ptr(T* data) :data(data), count(new int(1)){}//构造函数,初始化
	share_ptr(const share_ptr<T>& rp){
		data = rp.data;
		count = rp.count;
		(*count)++; }
	share_ptr<T>& operator=(const share_ptr<T>& rp)
	{ 
		if (rp.data==data) return *this
		else
		{ 
			if (*count == 1)
			{
				delete data,data=NULL;
				delete count,count=NULL;
			}
			data = rp.data;
			count = rp.count;
			--*count;
			++*rp.count;
		}
		return *this;
		
	}
	T* operator->(){ return data; }
	T& operator*(){ return *data; }
	~share_ptr(){//count为1,直接释放,否则count-- 
		if(*count==1) delete data,delete count;
		else --*count ,cout << "还有:" << *count << "指向当前对象"<<endl;
	}

};

int main()
{
	//定义一个基础对象类指针
	Point *pa = new Point(10, 20);

	//定义三个智能指针类对象,对象都指向基础类对象pa
	//使用花括号控制三个智能指针的生命周期,观察计数的变化
	{
		share_ptr<Point> sptr1(pa);//此时计数count=1
		cout << "sptr1:" << sptr1->getX() << "," << sptr1->getY() << endl;
		{
			share_ptr<Point> sptr2(sptr1); //调用拷贝构造函数,此时计数为count=2
			cout << "sptr2:" << sptr2->getX() << "," << sptr2->getY() << endl;
			{
				share_ptr<Point> sptr3 = sptr1; //调用赋值操作符,此时计数为conut=3
				cout << "sptr3:" << (*sptr3).getX() << "," << (*sptr3).getY() << endl;
			}
			//此时count=2
		}
		//此时count=1;
	}
	//此时count=0;pa对象被delete掉
	cout << pa->getX() << endl;
	system("pause");
	return 0;
}

 执行结果:

share_ptr与weak_Ptr:https://www.cnblogs.com/wangkeqin/p/9351191.html

https://www.cnblogs.com/curo0119/p/8919990.html

注意事项:https://blog.csdn.net/zhubaohua_bupt/article/details/81430342

 

weak_ptr:https://www.cnblogs.com/blog-yejy/archive/2018/09/30/9727070.html

posted @ 2019-08-06 23:29  白伟碧一些小心得  阅读(398)  评论(0编辑  收藏  举报