shared_ptr使用误区
//shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。
//https://www.cnblogs.com/acmLLF/p/14730783.html
//https://blog.csdn.net/weixin_44826356/article/details/105912215
//异常安全 https://www.jianshu.com/p/03eea8262c11
//正确用法
Shared_ptr<int> pInt2(new int(1)); //此时count是1
Shared_ptr<int> pInt3(pInt2);///* 用一个shared_ptr对象来初始化另一个shared_ptr实例 */ //此时count是2
Shared_ptr<int> pInt4 = pInt2; //此时count是3
//错误用法
int *pInt1 = new int(11); //避免使用裸指针类型的变量来创建std::shared_ptr指针
Shared_ptr<int> pInt2(pInt1 ); //此时count是1
Shared_ptr<int> pInt4 = pInt1 ; //此时count是1
总结 : 还是得用make_shared,不能用裸指针(控制块的T和count不在连续的内存了),也不能用shared_ptr(new T)(会造成异常安全)。
手写简易shared_ptr
template<typename T>
class Shared_ptr
{
private:
int *count;
T *ptr;
mutex *m;
void addCount()
{//计数器
m->lock();
(*count)++;
m->unlock();
}
void release()
{
bool flag = false; //deleteflag
m->lock();
(*count)--;
if (*count == 0)
{//说明计数器清零了
delete count;
delete ptr;
flag = true;
}
m->unlock();
if (flag == true)
{
delete m; //把锁也删除了
}
}
public:
Shared_ptr(T* tptr):ptr(tptr),count(new int(1)),m(new mutex){} //构造函数
~Shared_ptr(){
//析构函数
release();
}
Shared_ptr(const Shared_ptr<T> & sp):ptr(sp.ptr), count(sp.count), m(sp.m)
{
addCount();
}
Shared_ptr<T> * operator=(const Shared_ptr<T> & sp)
{
if (ptr != sp.ptr)
{//if (this != &sp)
ptr = sp.ptr;
count = sp.count;
m = sp.m;
addCount(); //计数器+1
}
return *this;
}
T& operator*() { return *ptr };
T* operator->() { return ptr; }
int usecount()
{
return *count;
}
};