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;
}
评论区