由于面试的时候被问到过几次智能指针,所以闲下来打算从头理一遍智能指针的实现思路,自己实现一个shared_ptr,也能够更好地理解智能指针。
智能指针说白了就是用类把指针封装起来,这样就不必担心内存泄漏的问题了,因为类的对象在出作用域的时候会自动调用析构函数。
因此智能指针要具备指针的基本功能:
- 首先要有一个T类型的指针,用于封装实际的指针(初始化);
- 其次一定要有一个int型指针,用于引用计数,同步更新指向同一内存空间的智能指针有多少个;
- 要自己写构造函数、拷贝构造函数、拷贝赋值函数及析构函数;
- 重载 解引用运算符 * 和 指向运算符 -> ;
- 最后useCount函数用于获取该对象所封装指针的引用计数。
另外还编写了几个测试样例,用于验证是否实现了shared_ptr的基本功能,具体代码如下:
#include <iostream>
using namespace std;
template<typename T>
class SharedPtr {
private:
T* m_ele;
int* m_num;
public:
SharedPtr(): m_ele(nullptr){
cout << "Hello Constructor 1 !" << endl;
m_num = new int(0);
}
SharedPtr(T* x): m_ele(x){
cout << "Hello Constructor 2 !" << endl;
m_num = new int(1);