c++实现一个shared_ptr
时间: 2023-09-03 20:15:40 浏览: 103
以下是一个简单的shared_ptr的实现,仅用于参考。
```c++
template<typename T>
class shared_ptr {
public:
shared_ptr() : ptr(nullptr), ref_count(nullptr) {}
shared_ptr(T* p) : ptr(p), ref_count(new int(1)) {}
shared_ptr(const shared_ptr<T>& other) : ptr(other.ptr), ref_count(other.ref_count) {
if (ref_count) ++(*ref_count);
}
~shared_ptr() {
dispose();
}
shared_ptr<T>& operator=(const shared_ptr<T>& other) {
if (this != &other) {
dispose();
ptr = other.ptr;
ref_count = other.ref_count;
if (ref_count) ++(*ref_count);
}
return *this;
}
T* operator->() const {
return ptr;
}
T& operator*() const {
return *ptr;
}
bool operator==(const shared_ptr<T>& other) const {
return ptr == other.ptr;
}
bool operator!=(const shared_ptr<T>& other) const {
return !(*this == other);
}
bool operator<(const shared_ptr<T>& other) const {
return ptr < other.ptr;
}
bool operator>(const shared_ptr<T>& other) const {
return other < *this;
}
bool operator<=(const shared_ptr<T>& other) const {
return !(other < *this);
}
bool operator>=(const shared_ptr<T>& other) const {
return !(*this < other);
}
bool is_null() const {
return ptr == nullptr;
}
int use_count() const {
return ref_count ? *ref_count : 0;
}
T* get() const {
return ptr;
}
private:
T* ptr;
int* ref_count;
void dispose() {
if (ref_count) {
--(*ref_count);
if (*ref_count == 0) {
delete ptr;
delete ref_count;
}
ptr = nullptr;
ref_count = nullptr;
}
}
};
```
该shared_ptr类实现了拷贝构造函数、拷贝赋值运算符、析构函数、箭头运算符、解引用运算符、相等运算符、不等运算符、比较运算符、is_null()方法、use_count()方法和get()方法。
在构造函数中,初始化指针ptr为nullptr,引用计数ref_count为nullptr。在拷贝构造函数中,ptr和ref_count被复制,并且引用计数加1。在析构函数中,如果引用计数不为0,就减1,如果减到0,就删除指针ptr和引用计数ref_count。在赋值运算符中,先dispose旧的shared_ptr,然后复制新的shared_ptr,最后增加引用计数。在箭头运算符和解引用运算符中,返回指针ptr。在相等运算符和不等运算符中,比较指针ptr。在比较运算符中,比较指针ptr。在is_null()方法中,判断指针ptr是否为nullptr。在use_count()方法中,返回引用计数ref_count的值,如果为nullptr,则返回0。在get()方法中,返回指针ptr。
阅读全文