/// 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;
}
手写共享指针
来自
标签:
发表回复