大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks

1、利用类的析构函数避免内存泄漏
如果在new和delete之间抛出异常,则delete不被执行,内存泄漏,如下代码只输出"new",delete没有被调到:

void* operator new(size_t)
{
    cout
<<"new"<<endl;
    
return NULL;
}


void operator delete(void*)
{
    cout
<<"delete"<<endl;
}


void Test()
{
    
int *= new int;
    
throw exception();
    delete i;
}


int main(int argc, char *argv[])
{
    
try
    
{
        Test();
    }

    
catch()
    
{
        
    }


    
return 0;
}


可以利用类的析构函数防止此类内存泄漏,将要操作的int*封装在自己的类中:
class MyInt
{
public:
    MyInt() 
{i = new int;}
    
~MyInt() {delete i;}

private:
    
int* i;
}
;
如下代码输出"new" "delete",内存没有泄露。
void Test()
{
    MyInt i;
    
throw exception();
}


int main(int argc, char *argv[])
{
    
try
    
{
        Test();
    }

    
catch()
    
{
        
    }


    
return 0;
}

把内存的释放放到类的析构函数中,避免了手动去释放的过程,而且当类类型的变量离开自己的生存空间时,自动调用析构函数释放内存。



2、构造函数中抛出异常
class Object
{
public:
    Object() 
        :i(
new int),
         j(
new int)
    
{
        
throw exception();
    }


    
~Object() {delete i; delete j;}

private:
    
int* i;
    
int* j;
}
;

void Test()
{
    Object b;
}


int main(int argc, char *argv[])
{
    
try
    
{
        Test();
    }

    
catch()
    
{
        
    }


    
return 0;
}
上述代码输出"new" "new",构造函数中抛出异常,Object对象没有被创建,所以析构函数不会被调到,内存泄漏。

若用MyInt封装一下,把释放过程放在MyInt的析构函数中,则不会发生内存泄漏:
class Object
{
public:
    Object() 
        :i(MyInt()),
         j(MyInt())
    
{
        
throw exception();
    }


    
~Object() {}

private:
    MyInt i;
    MyInt j;
}
;



posted on 2009-05-22 16:52 大胖 阅读(278) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理