2023年7月4日
手写共享指针
/// author: Tang Guofang/// date: 2023-07-04/// description:/// 手写共享指针,主要包含计数器和指针两个成员变量,计数器用来记录指针的引用次数,指针用来指向堆内存。/// 其他的就是常规的构造函数、拷贝构造函数与赋值函数,析构函数,重载*和->操作符。#include <iostream>#include <string>/// @brief 手写共享指针/// @tparam T 指针内存类型template <class T>class shared_ptr_t {private: T* ptr_; int* count_;
private: /// @brief 释放内存 void release() { --(*count_); if (ptr_ && (*count_) == 0) { delete ptr_; delete count_; } } /// @brief 根据传进来的指针,增加引用计数 /// @param sp 指针 void add_count(shared_ptr_t<T>& sp) { ptr_ = sp.ptr_; count_ = sp.count_; if (ptr_) { ++(*count_); } }
public: /// @brief 构造函数 /// @param ptr 指针 shared_ptr_t(T* ptr = nullptr) : ptr_(ptr) { if (ptr_) { count_ = new int(1); } } /// @brief 拷贝构造函数 /// @param sp 指针 shared_ptr_t(shared_ptr_t& sp) { add_count(sp); } /// @brief 赋值函数 /// @param sp 指针 /// @return shared_ptr_t<T>& shared_ptr_t<T>& operator=(shared_ptr_t<T>& sp) { if (this != &sp) { release(); add_count(sp); } return *this; } /// @brief 析构函数 ~shared_ptr_t() { printf("destruct shared_ptr count: %d\n", *count_); release(); } /// @brief 重载*和->操作符 /// @return T& T& operator*() { return *ptr_; } T* operator->() { return ptr_; } T* get() { return ptr_; } int use_count() { return *count_; } int* count() { return count_; }
};
int main() { shared_ptr_t<std::string> sp_test{new std::string("Hello")}; shared_ptr_t<std::string> sp_test2{sp_test}; shared_ptr_t<std::string> sp_test3{new std::string("World")}; printf("sp_test3: %s\n", sp_test3->c_str()); printf("sp_test3 use count:%d\n", sp_test3.use_count()); sp_test3 = sp_test2; printf("sp_test: %s\n", sp_test->c_str()); printf("sp_test use count:%d\n", sp_test.use_count()); printf("sp_test2: %s\n", sp_test2->c_str()); printf("sp_test2 use count:%d\n", sp_test2.use_count()); std::cout << sp_test.get() << std::endl; std::cout << sp_test2.get() << std::endl; return 0;}