C++ sharedPtr实现

本文详细介绍了C++中一个简单的`shared_ptr`模板类的实现,包括构造函数、复制构造函数、指针和解引用运算符的重载,以及赋值操作符的实现。此外,还展示了如何在`main`函数中使用`shared_ptr`来管理内存,强调了智能指针在内存管理中的作用和引用计数的概念。
#include <iostream>
using namespace std;

template <typename T>
class shared_ptr {
private:
	// 引用计数指针与模板指针
    int* count;
	T* ptr;
public:
    // 构造函数,初始化引用计算与模板指针
	shared_ptr(T* p) : count(new int(1)), ptr(p) {
		cout << "调用构造函数" << endl;
	}
	// 复制构造函数,引用计算+1
	shared_ptr(shared_ptr<T>& other) : count(&(++*other.count)), ptr(other.ptr){
		cout << "调用复制构造函数" << endl;
	}
	// 指针运算符
	T* operator->() {
		cout << "调用指针运算符" << endl;
	    return ptr; // 返回模板指针
	}
    // 解引用运算符
	T& operator*() {
		cout << "调用解引用运算符" << endl;
	    return *ptr; // 返回对象本身
	}
	// 赋值操作符重载
	shared_ptr<T>& operator=(shared_ptr<T>& other) {
	    ++*other.count;
		if (this->ptr && --*this->count == 0) {
			 cout << "清理原智能指针" << endl;
		     delete count;
			 delete ptr;
		}
		cout << "调用赋值操作符" << endl;
		this->ptr = other.ptr;
		this->count = o
`shared_ptr` 是 C++ 标准库中用于管理动态分配对象生命周期的智能指针之一,其核心机制是基于引用计数实现的。该机制确保了多个 `shared_ptr` 实例可以共享同一个对象,并在最后一个指向该对象的 `shared_ptr` 被销毁或重置时自动释放资源。 ### 基本结构 一个简化版的 `shared_ptr` 类通常包含两个关键部分: - **指向实际对象的指针**(例如 `T* ptr`)。 - **指向引用计数的指针**(例如 `int* count`),用于记录当前有多少个 `shared_ptr` 实例共享该对象。 当一个新的 `shared_ptr` 从另一个实例复制或赋值而来时,它会递增共享的引用计数;当某个 `shared_ptr` 被销毁或重新赋值时,它会递减引用计数。如果引用计数变为零,则删除所管理的对象和引用计数器本身[^2]。 ### 构造与析构行为 #### 构造函数 构造函数负责初始化内部指针和引用计数器。对于直接构造的情况,新创建的 `shared_ptr` 拥有唯一的引用计数: ```cpp template<typename T> smart_ptr<T>::smart_ptr(T* p) : ptr(p), count(new int(1)) {} ``` #### 拷贝构造函数 拷贝构造函数将原始指针和引用计数器指针复制到新的 `shared_ptr` 中,并增加引用计数: ```cpp template<typename T> smart_ptr<T>::smart_ptr(smart_ptr<T>& other) : ptr(other.ptr), count(other.count) { ++(*count); } ``` #### 赋值操作符 赋值操作符需要处理自我赋值问题,并减少旧对象的引用计数(如果为零则释放内存),然后增加新对象的引用计数: ```cpp template<typename T> smart_ptr<T>& smart_ptr<T>::operator=(smart_ptr<T>& other) { if (this != &other) { if (--(*count) == 0) { delete ptr; delete count; } ptr = other.ptr; count = other.count; ++(*count); } return *this; } ``` #### 析构函数 析构函数递减引用计数,若引用计数变为零,则释放对象和引用计数器: ```cpp template<typename T> smart_ptr<T>::~smart_ptr() { if (--(*count) == 0) { delete ptr; delete count; } } ``` ### 辅助方法 #### 获取引用计数 通过 `use_count()` 方法返回当前引用计数的值: ```cpp template<typename T> int smart_ptr<T>::use_count() { return *count; } ``` #### 解引用操作 提供 `operator*` 和 `operator->` 以允许像普通指针一样访问对象成员: ```cpp template<typename T> T& smart_ptr<T>::operator*() { return *ptr; } template<typename T> T* smart_ptr<T>::operator->() { return ptr; } ``` ### 特殊支持:enable_shared_from_this 某些情况下,类希望从自身获得 `shared_ptr` 实例。为此,C++ 提供了 `enable_shared_from_this` 模板类。其实现维护了一个弱引用 `_M_weak_this`,避免循环引用问题,从而安全地生成 `shared_ptr`: ```cpp class enable_shared_from_this { protected: shared_ptr<const _Tp> shared_from_this() const { return shared_ptr<const _Tp>(this->_M_weak_this); } private: mutable weak_ptr<_Tp> _M_weak_this; }; ``` 该功能在 `shared_ptr` 控制块中被特别处理,使得调用 `shared_from_this()` 能正确获取到 `shared_ptr` 实例[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值