0%

C++:SmartPointer

为何使用智能指针?

  1. 因为能帮我们管理内存,避免内存泄漏
  2. 能帮我们处理空悬指针(俗称野指针,即delete掉指针后,原来的指针指向了垃圾区域)的问题

智能指针的类型

  • shared_ptr: 多个智能指针指向同一块区域,该对象会在最后一个引用被销毁时释放。
  • unique_ptr: 每个对象只能有一个智能指针指向它,避免资源泄漏。

shared_ptr的实现

详见 SmartPtr
类的内部细节如下:
内部ptr保留的是真实的指针,由该类来自动维护它
count是对真实指针引用的计数

1
2
3
4
5
6
7
8
9
10
11
12
template<class T>
class sharedPtr {
private:
T* ptr;
int* count;
public:
sharedPtr();
sharedPtr(T*);
~sharedPtr();
sharedPtr(const sharedPtr<T>& t);
sharedPtr<T>& operator=(const sharedPtr<T>& right);
};

对于 p1(p2)这种复制构造,事实上是将参数的count加一,即又增加了对资源的引用

1
2
3
4
5
6
7
8
template<class T>
sharedPtr<T>::sharedPtr(const sharedPtr<T>& t)
{
ptr = t.ptr;
count = t.count;
(*count)++;
cout << "copy from " << &t << "to" << this << endl;
}

对于p2 = p2这种复制构造,事实上是将右侧的的count减一,将左侧的count减一,减后进行判断是否要进行资源的释放来自行维护。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class T>
sharedPtr<T>& sharedPtr<T>::operator=(const sharedPtr<T>& right)
{
(*right.count)++;
(*count)--;
if (*count == 0) {
delete ptr;
delete count;
ptr = nullptr;
count = nullptr;
cout << "delete left element:" << this << endl;
}
ptr = right.ptr;
count = right.count;
cout << "copy right to left" << endl;
return *this;
}