目 录CONTENT

文章目录

C++ 手动实现 shared_ptr

TalentQ
2025-10-13 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

1 shared_ptr 简述

共享指针。允许多个 shared_ptr 指向同一个对象。

shared_ptr 的内部共同维护一个计数器,记录当前有多少个 shared_ptr 指向共同的对象。当 计数器为0时,释放对象资源。计数器本身是线程安全的。

手动实现 shared_ptr

  • 使用 atomic 作为计数器,原子操作是线程安全的;

  • 实现 显式的带参构造函数、拷贝构造函数、赋值构造函数、析构函数;

  • 实现 get_count()get_raw_ptr() 接口;

  • 实现 operator->()operator*() 运算符的重载;

2 代码实现

#include <atomic>
#include <iostream>

template <typename T>
class SharedPtr {
 public:
  explicit SharedPtr(T* ptr) : ptr_(ptr), count_(new std::atomic<int>(1)) {}

  SharedPtr(const SharedPtr<T>& other)
      : ptr_(other.ptr_), count_(other.count_) {
    ++(*count_);
  }

  SharedPtr<T>& operator=(const SharedPtr<T>& other) {
    if (this != &other) {
      release();
      ptr_ = other.ptr_;
      count_ = other.count_;
      ++(*count_);
    }

    return *this;
  }

  ~SharedPtr() { release(); }

  int get_count() const { return *count_; }

  T* get_raw_ptr() const { return ptr_; }

  T* operator->() const { return ptr_; }

  T& operator*() const { return *ptr_; }

 private:
  void release() {
    if (ptr_ && --(*count_) == 0) {
      delete ptr_;
      delete count_;
    }
  }

 private:
  T* ptr_;
  std::atomic<int>* count_;
};

int main() {
  SharedPtr<int> ptr1(new int(10));
  SharedPtr<int> ptr2(ptr1);
  SharedPtr<int> ptr3 = ptr2;

  std::cout << "count: " << ptr3.get_count() << std::endl;

  return 0;
}

0

评论区