一、什么是智能指针
智能指针就是用一个对象维护另一个内存空间,当我们new出一块空间地址后,就不用手动的去delete它,而是交给智能指针帮我们做这件事。简单的说智能指针就是自动的帮我们释放new的内存,而不用手动释放。智能指针实现的原理就是通过调用析构函数来间接释放new的内存。
二、auto_ptr使用方法
#include <iostream>
#include <memory> // auto_ptr 包含的头文件
using namespace std;
class MyType
{
public:
MyType()
{
cout << "MyType()..." << endl;
}
~MyType()
{
cout << "~MyType()..." << endl;
}
};
int main()
{
MyType * pType = new MyType;
auto_ptr<MyType> autoPtr(pType);
return 0;
}
运行结果:
MyType()...
~MyType()...
结果显示析构函数~MyType()被调用 说明autoPtr已经帮我们自动回收pType指向的内存空间 所以不用我们手动delete pType;
三、智能指针自我实现
在很多面试题都会叫你自己实现一个智能指针 这是面试中经常考察的点 下面我们来动手操作一下:
#include <iostream>
#include <memory>
using namespace std;
template <typename T>
class MyAutoPtr
{
private:
T * ptr;
public:
MyAutoPtr(T* pt)
{
ptr = pt;
}
~MyAutoPtr()
{
if (ptr != NULL)
{
delete ptr;
ptr = NULL;
cout << "delete ptr" << endl;
}
}
// 重载 -> 运算符
T* operator->()
{
return this->ptr;
}
// 重载 * 运算符
T& operator*()
{
return *(this->ptr);
}
};
class A
{
public:
int a;
A() :a(10) { cout << "A()..." << endl; }
~A(){ cout << "~A()..." << endl; }
void funa()
{
cout << "a = " << a << endl;
}
};
void main()
{
A * a = new A;
MyAutoPtr<A> autoPtr(a);
autoPtr->funa();
(*autoPtr).funa();
}
运行结果:
A()...
a = 10
a = 10
~A()...
delete ptr
测试结果可一看出我们实现的智能指针能够正确的回收内存 基本功能都已经实现啦。
四、总结
通过上面的例子我们可以知道智能指针的原理就是通过一个对象autoPtr去维护另一个new出来的内存空间,当autoPtr的生存周期到了时会销毁对象autoPtr,而在销毁一个对象的时候必然会调用该对象的析构函数,此时我们就可以再调用的析构函数里释放之前new出来的内存空间。算啊发