描写:在体例 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();