条款九:利用析构函数避免内存泄露

来源:互联网 发布:网络谩骂公安如何处理 编辑:程序博客网 时间:2024/06/03 15:31

条款九:利用析构函数避免内存泄露

  在程序使用一个通过动态内存分配的指针时,函数调用的中途发生异常,C语言的做法一般是尽可能的考虑到所有可能发生异常的情况,并在函数执行的过程中通过if…else…语句判断某种情况的发生并对相应情况进行处理,这种做法很依赖程序员的思维严密性,如果程序员在处理异常时,少考虑几种情况,错误将无可避免的蔓延。而C++中提供了异常处理机制execption:

try{    //the executable code}catch(...){    //handle the execption}

  这种处理方式相对于C语言来说,用户不用担心有考虑不到的错误被遗忘;和C语言相同的地方是处理方式由程序员决定,内存的释放等在代码量过大时,这种处理方式依然存在C语言存在的缺陷。

1. 使用auto_ptr

  C++提供了auto_ptr智能指针来进行内存自动管理,当错误发生时,程序员不用在意内存的分配情况,只需处理其他事宜即可。然而,智能指针也存在很多局限,所以不要乱用。

std::auto_ptr<fun> p(new fun(1)) ;         //即使不释放也不存在内存泄露的问题

auto_ptr的缺陷:

  1. auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。当将两个
    auto_ptr指向同一个对象时,后指向对象的指针会保留,先指向对象的指针会失去所有
    权,不能再使用;
  2. auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要
    调用delete[]。
  3. auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如
    share_ptr。
  4. auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这
    过程中auto_ptr会传递所有权。

2. 利用auto_ptr的原理将资源封装于类中

  设计一个class将资源封装于这个class中,用构造函数来为对象中的资源分配和获取资源,利用析构函数释放对象中的资源,并且向拷贝构造函数和赋值操作符声明为私有,这个资源的对象就是独一无二了。

class window_handle{private:    widget* w;    window_handle(const window_handle&);    window_handle& operator=(const window_handle&);public:    window_handle(widget* handle):w(handle){}    void destroy_window();    ~window_handle()    {        destroy_window(w);            //释放资源    }}

  这样就将一个分配于堆中的数据对象交由编译器作为栈上的成员进行内存管理

0 0
原创粉丝点击