如何手动实现一个简单的智能指针
时间: 2023-06-06 13:09:08 浏览: 156
C++智能指针 功能强大,高效
智能指针是一种能够自动管理动态内存分配的指针,可以避免由于内存分配和释放出错而导致的程序崩溃,并且可以方便地进行资源共享和拷贝。手动实现一个简单的智能指针可以按以下步骤进行:
1. 定义一个类来表示智能指针,同时保存指向的内存地址和引用计数。
2. 在类的构造函数中对指向的内存进行分配,并将引用计数初始化为1。
3. 在类的析构函数中对指向的内存进行释放。
4. 实现拷贝构造函数和赋值运算符重载,用来处理智能指针的拷贝和赋值操作。
5. 在拷贝构造函数和赋值运算符重载中更新引用计数,避免多个指针同时指向同一个资源时引用计数出错。
6. 在类中定义一个 get() 方法,用来获取指向的内存地址。
7. 在类中定义一个 operator->() 方法和 operator*() 方法,分别用来对指向的内存进行指针和解引用操作。
示例代码如下:
```
template<typename T>
class SmartPtr {
public:
SmartPtr() : m_ptr(nullptr), m_use_count(new int(0)) {}
SmartPtr(T* ptr) : m_ptr(ptr), m_use_count(new int(1)) {}
SmartPtr(const SmartPtr<T>& other) : m_ptr(other.m_ptr), m_use_count(other.m_use_count) {
++*m_use_count;
}
~SmartPtr() {
--*m_use_count;
if (*m_use_count == 0) {
delete m_ptr;
delete m_use_count;
}
}
SmartPtr<T>& operator=(const SmartPtr<T>& other) {
if (this != &other) {
--*m_use_count;
if (*m_use_count == 0) {
delete m_ptr;
delete m_use_count;
}
m_ptr = other.m_ptr;
m_use_count = other.m_use_count;
++*m_use_count;
}
return *this;
}
T* get() const {
return m_ptr;
}
T& operator*() const {
return *m_ptr;
}
T* operator->() const {
return m_ptr;
}
private:
T* m_ptr;
int* m_use_count;
};
```
使用示例:
```
SmartPtr<int> p1(new int(42));
SmartPtr<int> p2(p1);
SmartPtr<int> p3;
p3 = p1;
std::cout << *p1 << std::endl; // 42
*p2 = 24;
std::cout << *p1 << std::endl; // 24
std::cout << *p3 << std::endl; // 24
```
阅读全文