答案:该shared_ptr通过引用计数管理对象生命周期,构造时初始化计数,拷贝时递增,析构或赋值时递减,计数为零则释放资源。

实现一个简单的 shared_ptr,核心是模拟引用计数机制,确保多个指针共享同一块内存时,只有当最后一个指针释放时才真正删除对象。下面是一个简化但可运行的 shared_ptr 实现,帮助理解其原理。
基本结构设计
我们需要一个控制块来保存:
实际对象的指针引用计数(记录有多少 shared_ptr 指向该对象)
每个 shared_ptr 对象持有指向这个控制块的指针,而不是直接管理原始指针。
立即学习“C++免费学习笔记(深入)”;
templateclass SharedPtr {private: T* ptr_; // 指向实际对象 int* ref_count_; // 指向引用计数void release() { if (ref_count_ && --(*ref_count_) == 0) { delete ptr_; delete ref_count_; ptr_ = nullptr; ref_count_ = nullptr; }}
public:// 构造函数:接管原始指针explicit SharedPtr(T* ptr = nullptr): ptr_(ptr), refcount(ptr ? new int(1) : nullptr) {}
// 拷贝构造函数SharedPtr(const SharedPtr& other) : ptr_(other.ptr_), ref_count_(other.ref_count_) { if (ref_count_) { ++(*ref_count_); }}// 赋值操作符SharedPtr& operator=(const SharedPtr& other) { if (this != &other) { release(); // 释放当前资源 ptr_ = other.ptr_; ref_count_ = other.ref_count_; if (ref_count_) { ++(*ref_count_); } } return *this;}// 析构函数~SharedPtr() { release();}// 解引用T& operator*() const { return *ptr_; }T* operator->() const { return ptr_; }// 获取原始指针T* get() const { return ptr_; }// 判断是否为空bool is_null() const { return ptr_ == nullptr; }// 获取引用计数(用于调试)int use_count() const { return ref_count_ ? *ref_count_ : 0; }
};
关键点说明
引用计数共享:所有指向同一对象的 shared_ptr 实例共享同一个引用计数。拷贝时只增加计数,不复制对象。
release 函数:在析构或赋值前调用,减少计数并判断是否需要释放资源。
自赋值保护:赋值操作中检查 this != &other,防止自我赋值导致错误释放。
使用示例
#includestruct MyClass {MyClass() { std::cout << "构造n"; }~MyClass() { std::cout << "析构n"; }};
int main() {{SharedPtr p1(new MyClass);std::cout << "引用计数: " << p1.use_count() << "n";
{ SharedPtr p2 = p1; std::cout << "引用计数: " << p1.use_count() << "n"; } // p2 析构,计数减1 std::cout << "引用计数: " << p1.use_count() << "n";} // p1 析构,对象被删除return 0;
}
输出:
构造
引用计数: 1
引用计数: 2
引用计数: 1
析构
改进空间
工业级 shared_ptr 还需考虑:
线程安全:引用计数增减需原子操作支持自定义删除器(deleter)weak_ptr 配合避免循环引用控制块与对象内存合并优化(如 enable_shared_from_this)
但上述实现已涵盖 shared_ptr 最核心的引用计数管理逻辑。
基本上就这些。理解了这个简单版本,再看标准库实现会更容易。
以上就是c++++如何实现一个简单的智能指针_C++手写shared_ptr原理与实现的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485001.html
微信扫一扫
支付宝扫一扫