手写Shared_ptr shared_ptr是C11引入的智能指针通过引用计数功能实现多个指针共享一个对象的所有权。核心原理每个shared_ptr内部有一个引用计数拷贝时计数加一析构时计数减一计数降为0时自动删除所管理的对象。1.自动内存管理有效避免内存泄漏与野指针。2.共享对象所有权3.可以跨线程共享。#include atomic #include utility #include functional templatetypename T class SharedPtr { private: T* ptr_; std::atomicsize_t* ref_count_; public: // 默认构造 SharedPtr() noexcept : ptr_(nullptr), ref_count_(nullptr) {} // 从原始指针构造 explicit SharedPtr(T* ptr) : ptr_(ptr), ref_count_(nullptr) { if (ptr_) { ref_count_ new std::atomicsize_t(1); } } // 拷贝构造 SharedPtr(const SharedPtr other) noexcept : ptr_(other.ptr_), ref_count_(other.ref_count_) { if (ref_count_) { ref_count_-fetch_add(1, std::memory_order_relaxed); } } // 移动构造 SharedPtr(SharedPtr other) noexcept : ptr_(other.ptr_), ref_count_(other.ref_count_) { other.ptr_ nullptr; other.ref_count_ nullptr; } // 拷贝赋值 SharedPtr operator(const SharedPtr other) noexcept { if (this ! other) { SharedPtr temp(other); swap(temp); } return *this; } // 移动赋值 SharedPtr operator(SharedPtr other) noexcept { if (this ! other) { SharedPtr temp(std::move(other)); swap(temp); } return *this; } // 析构 ~SharedPtr() { release(); } // 交换 void swap(SharedPtr other) noexcept { std::swap(ptr_, other.ptr_); std::swap(ref_count_, other.ref_count_); } // 解引用 T operator*() const noexcept { return *ptr_; } T* operator-() const noexcept { return ptr_; } // 获取原始指针 T* get() const noexcept { return ptr_; } // 引用计数 size_t use_count() const noexcept { return ref_count_ ? ref_count_-load(std::memory_order_relaxed) : 0; } // 是否独占 bool unique() const noexcept { return use_count() 1; } // 重置为空 void reset() noexcept { release(); ptr_ nullptr; ref_count_ nullptr; } // 重置为新指针 void reset(T* ptr) { reset(); if (ptr) { ptr_ ptr; ref_count_ new std::atomicsize_t(1); } } // 布尔转换判断是否非空 explicit operator bool() const noexcept { return ptr_ ! nullptr; } private: void release() noexcept { if (ref_count_) { if (ref_count_-fetch_sub(1, std::memory_order_acq_rel) 1) { delete ptr_; delete ref_count_; } ptr_ nullptr; ref_count_ nullptr; } } };

相关新闻

最新新闻

LoRa模块实战指南:从原理到应用的远距离无线通信技术

LoRa模块实战指南:从原理到应用的远距离无线通信技术

1. LoRa模块:从概念到上手的无线通信利器最近在折腾一些物联网项目,从环境监测到远程控制,无线通信是绕不开的一环。在众多方案里,LoRa这个名字出现的频率越来越高。它不像Wi-Fi那样家喻户晓,也不像蓝牙那样触手可及&a…

2026/8/2 4:41:14
PointNet++复现实战:从环境配置到模型训练的全流程避坑指南

PointNet++复现实战:从环境配置到模型训练的全流程避坑指南

1. 项目概述:从理论到实践的3D点云处理 最近在复现PointNet的分类和分割实验,这几乎是每个踏入3D点云深度学习领域的研究者和工程师的必经之路。PointNet作为PointNet的改进版本,通过引入层次化特征学习和局部特征提取,显著提升了…

2026/8/2 4:41:14
基于STM32F7高性能MCU的嵌入式开源硬件平台Open746I-C深度解析

基于STM32F7高性能MCU的嵌入式开源硬件平台Open746I-C深度解析

1. 项目概述:Open746I-C,一个面向嵌入式开发者的开源硬件平台如果你在嵌入式开发领域摸爬滚打了一段时间,尤其是玩过STM32、ESP32这类MCU,那么“Open746I-C”这个名字可能会让你眼前一亮。它不是一个具体的产品型号,而…

2026/8/2 4:41:14
构建高可用AI服务集成:防御性架构设计与多供应商故障转移实战

构建高可用AI服务集成:防御性架构设计与多供应商故障转移实战

1. 项目概述:当AI服务成为业务基石,我们如何应对“断供”风险?最近在开发者圈子里,一个话题讨论得沸沸扬扬:一批用户,据说有60人左右,他们重度依赖的Claude API服务一夜之间被Anthropic官方“断…

2026/8/2 4:41:14
学习嵌入式第十二天:深入理解指针与一维字符型数组传参

学习嵌入式第十二天:深入理解指针与一维字符型数组传参

引言:指针与数组的紧密联系 在嵌入式C语言编程中,指针和数组是密不可分的核心概念。第十二天的学习重点聚焦于指针与一维字符型数组的传参机制,这是理解字符串处理、内存操作和函数接口设计的关键。掌握这部分内容,意味着你能更高…

2026/8/2 4:41:14
Unity URP Shader实现模型渐变透明效果:从原理到实战

Unity URP Shader实现模型渐变透明效果:从原理到实战

1. 项目概述:为什么模型渐变透明是URP中的高频需求?在Unity的通用渲染管线(URP)中实现模型的渐变透明效果,这听起来像是一个具体的Shader技术问题,但背后折射出的其实是现代游戏和交互应用中对视觉表现力日…

2026/8/2 4:36:14