文章目录
先来看一看智能指针的发展历史
- C++98产生了第一个智能指针auto_ptr
- C++ boost给出了scoped_ptr和shared_ptr和weak_ptr
- C++TR1 引入了shared_ptr(TR1为非标准版)
- C++11引入unique_ptr和shared_ptr和weak_ptr
这些智能指针参考boost中的智能指针实现保证new生成的对象在程序的任何位置都可释放
RAII思想:一种利用对象生命周期来控制程序资源,在对象构造时获取资源,控制资源的访问在对象的生命周期内保持有效,最后在对象析构时释放资源
使用RAII方法控制程序资源的优点:
1.不需要显示释放资源
2.保持对象所需要的资源在其生命周期内一直保持有效
template <class T>
class SmartPtr {
public:
SmartPtr(T* ptr = nullptr)
:_ptr(ptr)
{
}
SmartPtr()
{
if (_ptr)
delete _ptr;
}
private:
T* _ptr;
};
void MergeSort(int* a, int n) {
int* tmp = (int*)malloc(sizeof(int)*n);
SmartPtr<int> sp(tmp);//将tmp指针托付给sp对象
_MergeSort(a, 0, n - 1, tmp);
}
int main()
{
try {
int a[5] = {
0,1,2,4,3 };
MergeSort(a, 5);
}
catch (const exception& e)
{
cout << e.what() << endl;
}
}
}
接下来介绍三种智能指针
auto_ptr
C++98中在库提供了auto_ptr的智能指针
auto_ptr<T> ptr(new T);
auto_ptr实现原理:将资源的管理权转移到另一个对象
auto_ptr存在的问题:当目标对象被置空之后,再通过此对象访问资源的时候就会出现问题
简单的模拟实现
template<T>
class AutoPtr
{
public: