如何简化临时内存的分配与释放

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

描述:在编制 C++ 程序时,最常碰到的一个令人恼火的问题便是临时资源的分配与释放问题, 由于程序的逻辑关系通常很复杂,引发异常的可能性也很多,为了妥善处理运行时异常, 我们不得不在可能引发异常的任何地方释放已分配成功的临时资源,然后返回, 以保证程序的健壮稳定及系统的清洁,所以程序中可能随处可见delete、free等语句, 显得很繁! 那么有没有办法使得只顾分配、使用临时资源,而不顾其后事如何呢?

在Delphi中可以用try...finally...实现一些资源的保护,但C++Builder中好象没有try...finally 这样的语法结构, 所以,在程序中为了正确释放内存等临时资源,不得不在有可能出错的任何地方书写释放语句delete,以保护有限的资源。 其实有一个较简单的方法可以一劳永逸,即为临时资源定义一个公共的类,将C++的new / delete语句稍作封装即可,类的定义如下:

TMemory{

public:

void *ptr;

public:

TMemory(int size){ ptr=(void*)new char[size]; _WINAPI_::ZeroMemory(ptr,size);}

~TMemory(void){ if(ptr) delete ptr; }

};

应用示例如下:

void TMainForm::function(int size)

{

TMemory mem(size); //注重捕捉异常:EOutOfMemory!

char *str=(char *)mem.ptr; //取得分配的内存指针

some_func(str); //其它操作

return; //直接返回,而不必担心释放内存,即使some_func中发生异常同样会自动释放内存

}

如何简化等待光标的的设置与还原 ?

--------------------------------------------------------------------------------

解决问题的原理同上,类的定义如下:

#pragma warn -bei //关闭枚举变量赋值的警告

class TWaitCursor{//自动处理等待光标,当函数调用栈解体时自动还原光标

private:

TCursor oldc;

public:

TWaitCursor(void) : oldc(Screen->Cursor){ Screen->Cursor = crHourGlass; }

~TWaitCursor(void){ Screen->Cursor = oldc; }

};

应用示例如下:

void TMainForm::function(void)

{

some_opr(...); //其它操作

TWaitCursor waitit; //变为等待光标

some_func(...); //其它操作

return; //直接返回,光标会自动还原

}

当创建TWaitCursor类的临时变量时,光标会改为等待状态,当该函数返回时,会自动还原光标。

注:创建自动变量时应采用如下方式,以避免Borland编译器的自动优化:

TWaitCursor wait;

而不能定义成下面的样子:

TWaitCursor wait();

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航