目录
一、智能指针
1.shared_ptr
一、智能指针
1.shared_ptr
shared_ptr 是一种共享式智能指针,可以被多个 shared_ptr 对象共享同一个对象,当最后一个 shared_ptr 对象销毁时,它所管理的对象也会被销毁。
shared_ptr 使用引用计数来管理对象的生命周期;
当两个或多个对象使用shared_ptr
相互持有对方的指针时,每个对象的引用计数都至少为1。即使在没有外部引用的情况下,这些对象的引用计数也不会降为0,因为它们彼此之间保持着引用。由于引用计数无法降为0,这些对象的析构函数永远不会被调用,导致资源泄漏。
为了解决循环引用的问题,可以使用weak_ptr来取代shared_ptr。weak_ptr允许对象之间存在引用,但不会增加引用计数,也不会阻止对象的销毁。
/** shared_ptr **/
/* 三个成员变量: 指针 引用计数 锁(计数前后需要加锁解锁) */
/* 构造函数 拷贝构造函数 参数列表 */
/* 析构函数: Release() 具体实现 */
/* 运算符重载: = * -> (需要注意函数的type 和 返回类型 对应) */
/* 实现一个返回引用计数的大小的函数 */
template<class T>
class shared_ptr
{
private:
T* ptr;
int* ptrcount;
std::mutex* mt;
public:
// 构造函数
shared_ptr(T* _ptr):ptr(_ptr){
ptrcount = new int(1); // 引用计数
mt = new mutex; // 锁
}
void Addcount(){
mt->lock();
(*ptrcount)++; // 计数++
mt->unlock();
}
// 拷贝构造函数 参数列表
shared_ptr(shared_ptr<T>& sp):ptr(sp.ptr), ptrcount(sp.ptrcount), mt(sp.mt)
{
Addcount();
}
// operator关键字 操作符重载
shared_ptr<T>& operator=(const shared_ptr<T>& sp){
if(sp.ptr != ptr){ // 新指针和旧指针不一样
Release(); // 释放旧资源
ptr = sp.ptr; // 将新的给旧的
ptrcount = sp.ptrcount;
mt = sp.mt;
Addcount();
}
return *this; // 新指针和旧指针一样,则直接返回原来的
}
~shared_ptr(){ // 析构函数
Release();
}
int& use_count(){ // 返回引用计数的大小
return *ptrcount;
}
void Release()
{
bool deleteflag{false};
mt->lock(); //加锁
if(--(*ptrcount) == 0) // 两步:减少引用计数,如果为0则释放内存
{
delete ptrcount; // 删除指针
delete ptr;
ptrcount = nullptr; // 赋值为空指针,防止野指针
ptr = nullptr;
deleteflag = true;
}
mt->unlock(); //解锁
if(deleteflag == true){
delete mt;
mt = nullptr;
}
}
T& operator *(){ // 重载*运算符
return *ptr;
}
T* operator ->(){ // 重载->运算符
return ptr;
}
};
【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)-CSDN博客
shared_ptr循环引用问题_c++ shared_ptr互相引用解决方案-CSDN博客