目录
一、为什么需要智能指针?
在我们异常一节就已经讲过,当使用异常的时候,几个函数层层嵌套,其中如果抛异常就可能导致没有释放堆区开辟的空间。这样就很容易导致内存泄漏。关于内存泄漏,我也曾在C++内存管理一文中写过。
为了更好的管理我们申请的空间,C++引入了智能指针。
参考文章:
1.【C++】异常_
2. C++内存管理
二、智能指针
1.RAII
RAII
(
Resource Acquisition Is Initialization
)是一种
利用对象生命周期来控制程序资源
(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
在对象构造时获取资源
,接着控制对资源的访问使之在对象的生命周期内始终保持有效,
最后在
对象析构的时候释放资源
。借此,我们实际上把管理一份资源的责任托管给了一个对象。
这种做
法有两大好处:
- 不需要显式地释放资源。
- 采用这种方式,对象所需的资源在其生命期内始终保持有效。
template<class T>
class SmartPtr
{
public:
SmartPtr(T* ptr = nullptr)
:_ptr(ptr)
{
cout << "管理空间:" << _ptr << endl;
}
~SmartPtr()
{
if (_ptr)
{
delete _ptr;
}
cout << "释放空间:" << _ptr << endl;
}
private:
T* _ptr;
};
int main()
{
SmartPtr<int> sp1(new int(1));
return 0;
}
我们可以看到,智能指针的引入,极大的便利了我们管理空间。
在封装了几层的函数中抛异常,我们也能够来通过智能指针来管理好空间。
2.智能指针的完善
上述的
SmartPtr
还不能将其称为智能指针,因为它还不具有指针的行为。指针可以解引用,也可以通过->
去访问所指空间中的内容,因此:
AutoPtr
模板类中还得需要将
*
、
->
重载下,才可让其
像指针一样去使用
。
template<class T>
class SmartPtr
{
public:
SmartPtr(T* ptr = nullptr)
:_ptr(ptr)
{
cout << "管理空间" << _ptr << endl;
}
~SmartPtr()
{
if (_ptr)
{
delete _ptr;
}
cout << "释放空间:" << _ptr << endl;
}
T& operator*()
{
return *_ptr;
}
T* operator->()
{
return _ptr;
}
T& operator[](size_t pos)
{
return _ptr[pos];
}
private:
T* _ptr;
};
class Date
{
public:
int _y