在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();
最新评论