【C++手撸代码】实现一个shared_ptr

本文介绍了如何手动实现C++的shared_ptr智能指针,包括其核心功能如引用计数、对象的共享管理以及相关操作重载。通过详细步骤和测试案例,展示了shared_ptr的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近面试题有遇到这个题,让你手撸个shared_ptr
参考:
实现一个简单的shared_ptr
智能指针原理及实现(1)shared_ptr
写的很棒,学习一波。

一句话介绍shared_ptr智能指针:多个shared_ptr中的T *ptr能指向同一个内存区域(同一个对象),并共同维护同一个引用计数器。

一般来说,智能指针的实现需要以下步骤:
1.一个模板指针T* ptr,指向实际的对象。
2.一个引用次数(必须new出来的,不然会多个shared_ptr里面会有不同的引用次数而导致多次delete)。

3.重载operator*operator->,使得能像指针一样使用shared_ptr。
4.重载copy constructor,使其引用次数加一。
5.重载operator=,如果原来的shared_ptr已经有对象,则让其引用次数减一并判断引用是否为零(是否调用delete)。
 然后将新的对象引用次数加一。
6.重载析构函数,使引用次数减一并判断引用是否为零(是否调用delete)。

#include <string>
#include <iostream>
using namespace std;

template <typename T>
class Shared_ptr {
   
   
public:
	// 空参构造 空指针
	Shared_ptr():count(0), _ptr((T*)0) {
   
   }
	// 构造函数 count必须new出来
	Shared_ptr(T* p) : count(new int(1)), _ptr(p) {
   
   }
	
以下是一个简单的shared_ptr实现,仅用于参考。 ```c++ template<typename T> class shared_ptr { public: shared_ptr() : ptr(nullptr), ref_count(nullptr) {} shared_ptr(T* p) : ptr(p), ref_count(new int(1)) {} shared_ptr(const shared_ptr<T>& other) : ptr(other.ptr), ref_count(other.ref_count) { if (ref_count) ++(*ref_count); } ~shared_ptr() { dispose(); } shared_ptr<T>& operator=(const shared_ptr<T>& other) { if (this != &other) { dispose(); ptr = other.ptr; ref_count = other.ref_count; if (ref_count) ++(*ref_count); } return *this; } T* operator->() const { return ptr; } T& operator*() const { return *ptr; } bool operator==(const shared_ptr<T>& other) const { return ptr == other.ptr; } bool operator!=(const shared_ptr<T>& other) const { return !(*this == other); } bool operator<(const shared_ptr<T>& other) const { return ptr < other.ptr; } bool operator>(const shared_ptr<T>& other) const { return other < *this; } bool operator<=(const shared_ptr<T>& other) const { return !(other < *this); } bool operator>=(const shared_ptr<T>& other) const { return !(*this < other); } bool is_null() const { return ptr == nullptr; } int use_count() const { return ref_count ? *ref_count : 0; } T* get() const { return ptr; } private: T* ptr; int* ref_count; void dispose() { if (ref_count) { --(*ref_count); if (*ref_count == 0) { delete ptr; delete ref_count; } ptr = nullptr; ref_count = nullptr; } } }; ``` 该shared_ptr实现了拷贝构造函数、拷贝赋值运算符、析构函数、箭头运算符、解引用运算符、相等运算符、不等运算符、比较运算符、is_null()方法、use_count()方法和get()方法。 在构造函数中,初始化指针ptr为nullptr,引用计数ref_count为nullptr。在拷贝构造函数中,ptr和ref_count被复制,并且引用计数加1。在析构函数中,如果引用计数不为0,就减1,如果减到0,就删除指针ptr和引用计数ref_count。在赋值运算符中,先dispose旧的shared_ptr,然后复制新的shared_ptr,最后增加引用计数。在箭头运算符和解引用运算符中,返回指针ptr。在相等运算符和不等运算符中,比较指针ptr。在比较运算符中,比较指针ptr。在is_null()方法中,判断指针ptr是否为nullptr。在use_count()方法中,返回引用计数ref_count的值,如果为nullptr,则返回0。在get()方法中,返回指针ptr
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值