开辟了内存空间,必定要释放内存空间,如果不释放就会造成内存泄漏,引发安全问题。
如果代码量很少的时候,我们会记得释放掉开辟的空间,但是如果代码量过大,我们会忘记开辟的空间,那么就需要智能指针来帮助我们自动释放空间。
例如:
#include<memory>
int main()
{
int* tmp = new int[10];
auto_ptr<int> ap(tmp);
cout << *ap <<endl;
//delete []tmp;
return 0;
}
有了智能指针,下面的释放空间的语句我们就不需要了。
但是有个疑问,智能指针不应该是指针吗?
走到定义之后,我们会发现auto_ptr不是一个指针,而是一个类,ap就是一个对象,它会像指针一样使用。
那么,智能指针到底是怎样实现的,那我们就只有进入底层去深入剖析了。
首先是它的构造函数,
其次是拷贝构造函数,拥有权的释放
把指针_Myptr保留,然后将自己赋值成空
然后是运算符的重载
返回_Myptr指针指向的值
接下来是赋值语句,将自己的对象的拥有权释放掉,再重新设置给当前要赋值的对象
如果是指向不同空间的指针,释放当前指针_Myptr,把新的空间的指针_Ptr给_Myptr,让_Myptr管理新的空间
最后是析构函数
将空指针_Myptr释放
智能指针有很多的分类
C++98
auto_ptr
C++11
unique_ptr
Boost库
scoped_ptr(不允许拥有权的转移)
scoped_array
shared_ptr
shared_array
weak_ptr
instrusive_ptr