手写共享指针

/// 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;
}

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注