STL之防止内存泄露

jopen 10年前

       可以自由分配和释放内存造就了C++的灵活和强大,但这也是使用C++最容易出现问题的地方,内存泄露问题,估计程序猿都会或多或少的遇到,也遭受了很多程序猿们的深恶痛绝,无数个加班的晚上可能就是因为少了一个delete的缘故。
       用过C++的人基本上都应该会了较过一个叫STL(标准模板库)的东西,这个东西在一定程度上,更进一步推动了C++的发展和普及程序,里面对于C++ 模板以及C++三大特性封装、继承、多态的使用可以说是淋漓尽致,具体的介绍可以参考侯捷老师的《STL源码剖析》。STL有一个智能指针的东西,即 auto_ptr,有了智能指针以后,再也不用担心忘记调用delete释放堆内存了。auto_ptr主要是通过构造函数来绑定堆内存指针,当 auto_ptr对象销毁的时候,其析构函数就会释放掉绑定的堆内存,示例代码如下:

    void Func1()        {            int *ptr = new int;                    //...具体函数逻辑                    delete ptr; //当函数逻辑很复杂的时候,很容易忘记这一句        }                void Func2()        {            auto_ptr<int> ptr(new int);                    //...具体函数逻辑        }  
       上面的Fun1函数在申请和释放堆内存至少要两句代码,而使用auto_ptr的Fun2函数只需要一句代码就可以了,还能保证在退出作用于的时候自动释放申请的内存空间,既干净又环保。
       auto_ptr的实现就是《Effective C++》提到的以对象管理资源的方法,众所周知,类对象在退出其作用域时,会自动调用其析构函数,我们可以充分利用编译器提供的便利,在对象的构造函数生产资源,在对象的析构函数释放资源,这样就不用担心忘记释放资源了,但是既然有了auto_ptr这样的强大工具,我们没必要再重造车轮了,直接拿来主义就好了。