智能指针-----实现
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

浙公网安备 33010602011771号