如何简化临时内存的分配与释放
王俊蛟
描述：在编制 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();