shared_ptr 实现
时间: 2023-12-06 14:36:21 浏览: 84
shared_ptr是C++中的智能指针,用于管理动态分配的内存。它采用引用计数的方法来实现释放指针所指向的资源。当一个shared_ptr对象被创建时,它会创建一个计数器,计数器的初始值为1。每当有一个新的shared_ptr对象指向同一个资源时,计数器的值就会加1。当一个shared_ptr对象被销毁时,计数器的值就会减1。当计数器的值为0时,就会自动释放指针所指向的资源。
以下是一个shared_ptr的简单实现:
```c++
template <typename T>
class shared_ptr {
public:
shared_ptr(T* ptr = nullptr) : m_ptr(ptr), m_count(new int(1)) {}
shared_ptr(const shared_ptr<T>& other) : m_ptr(other.m_ptr), m_count(other.m_count) {
(*m_count)++;
}
~shared_ptr() {
(*m_count)--;
if (*m_count == 0) {
delete m_ptr;
delete m_count;
}
}
shared_ptr<T>& operator=(const shared_ptr<T>& other) {
if (this != &other) {
(*m_count)--;
if (*m_count == 0) {
delete m_ptr;
delete m_count;
}
m_ptr = other.m_ptr;
m_count = other.m_count;
(*m_count)++; }
return *this;
}
T& operator*() const {
return *m_ptr;
}
T* operator->() const {
return m_ptr;
}
private:
T* m_ptr;
int* m_count;
};
```
上述代码中,我们定义了一个模板类shared_ptr,它包含一个指向资源的指针m_ptr和一个计数器m_count。在构造函数中,我们将计数器的初始值设为1。在拷贝构造函数中,我们将指针和计数器都复制一份,并将计数器的值加1。在析构函数中,我们将计数器的值减1,如果计数器的值为0,则释放指针所指向的资源。在赋值运算符中,我们先将原来的指针和计数器的值减1,然后将新的指针和计数器赋值给当前对象,并将计数器的值加1。最后,我们还重载了*和->运算符,使得shared_ptr对象可以像指针一样使用。
阅读全文