智能指针shared_ptr的实现
时间: 2023-07-15 20:12:22 浏览: 65
智能指针shared_ptr是C++中一个常用的智能指针,它可以自动管理动态分配对象的内存,避免了手动释放内存的麻烦。shared_ptr的实现主要涉及到引用计数、内存管理和多线程安全等方面。
以下是shared_ptr的简单实现:
```c++
template <typename T>
class shared_ptr
{
public:
// 构造函数,初始化指针和引用计数
shared_ptr(T* ptr = nullptr) : m_ptr(ptr), m_count(new int(1)) {}
// 拷贝构造函数,引用计数加1
shared_ptr(const shared_ptr& other) : m_ptr(other.m_ptr), m_count(other.m_count) {
++(*m_count);
}
// 析构函数,引用计数减1,如果引用计数为0,则释放内存
~shared_ptr() {
if (--(*m_count) == 0) {
delete m_ptr;
delete m_count;
}
}
// 重载赋值运算符,先判断是否为同一个对象,如果不是,则引用计数减1,如果引用计数为0,则释放内存
shared_ptr& operator=(const shared_ptr& other) {
if (this != &other) {
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; }
// 返回引用计数
int use_count() const { return *m_count; }
private:
T* m_ptr; // 指向动态分配内存的指针
int* m_count; // 引用计数
};
```
在上面的实现中,每个shared_ptr对象都有一个指向动态分配内存的指针m_ptr和一个引用计数m_count。构造函数会初始化这两个成员变量,拷贝构造函数会将引用计数加1,析构函数会将引用计数减1,如果引用计数为0,则释放内存。重载赋值运算符会先判断是否为同一个对象,如果不是,则将原对象的引用计数减1,如果引用计数为0,则释放内存,然后将新对象的引用计数加1。重载*和->运算符可以让shared_ptr对象像指针一样使用。用use_count()函数可以获得当前对象的引用计数。