shared_ptr手撕
时间: 2023-09-13 21:11:56 浏览: 108
shared_ptr
shared_ptr是C++11引入的智能指针,用于管理动态分配的内存。它可以自动地进行内存的释放,避免了手动管理内存的麻烦和潜在错误。
下面是一个简单的手写shared_ptr的示例代码:
```cpp
template<typename T>
class shared_ptr {
public:
shared_ptr(T* ptr = nullptr) : m_ptr(ptr), m_refCount(new int(1)) {}
~shared_ptr() {
release();
}
shared_ptr(const shared_ptr& other) {
m_ptr = other.m_ptr;
m_refCount = other.m_refCount;
(*m_refCount)++;
}
shared_ptr& operator=(const shared_ptr& other) {
if (this != &other) {
release();
m_ptr = other.m_ptr;
m_refCount = other.m_refCount;
(*m_refCount)++;
}
return *this;
}
T* get() const {
return m_ptr;
}
T& operator*() const {
return *m_ptr;
}
T* operator->() const {
return m_ptr;
}
private:
void release() {
(*m_refCount)--;
if (*m_refCount == 0) {
delete m_ptr;
delete m_refCount;
}
}
private:
T* m_ptr;
int* m_refCount;
};
```
在上述代码中,我们定义了一个模板类`shared_ptr`。它包含一个指向堆内存的指针`m_ptr`,以及一个指向引用计数的指针`m_refCount`。构造函数用于初始化指针和引用计数,析构函数用于释放内存。拷贝构造函数和赋值运算符重载函数用于实现共享所有权的功能。
当一个新的`shared_ptr`对象被创建或复制时,引用计数会加1。当一个`shared_ptr`对象被销毁或赋值给其他对象时,引用计数会减1。当引用计数变为0时,表示没有任何对象在使用该内存块,此时释放内存。
使用`shared_ptr`可以更方便地管理动态分配的内存,避免了内存泄漏和悬空指针的问题。
阅读全文