⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lc_bcb_79.html

📁 C++Builder教学大全
💻 HTML
字号:


<HTML><HEAD><TITLE>C++Builder程序设计</TITLE>

<META content="text/html; charset=gb2312" http-equiv=Content-Type>

<META content="Microsoft FrontPage 4.0" name=GENERATOR></HEAD>

<BODY>

<TABLE align=center border=0 cellPadding=3 style="LINE-HEIGHT: 15pt" 

width="100%">

  <TBODY>

  <TR>

    <TD>

      <div align="center"><BR>

        <FONT color=#000000>如何简化临时内存的分配与释放? </FONT></div>

      <FONT color=#000000>

      <HR noShade SIZE=1 width="100%" align="center">

      </FONT> 

      <p align="center"><font color=#000000>王俊蛟</font></p>

      <p>描述:在编制 C++ 程序时,最常遇到的一个令人恼火的问题便是临时资源的分配与释放问题, 由于程序的逻辑关系通常很复杂,引发异常的可能性也很多,为了妥善处理运行时异常,  

        我们不得不在可能引发异常的任何地方释放已分配成功的临时资源,然后返回, 以保证程序的健壮稳定及系统的清洁,所以程序中可能随处可见delete、free等语句,  

        显得很繁! 那么有没有办法使得只顾分配、使用临时资源,而不顾其后事如何呢?<FONT color=#000000> </FONT> </p> 

      <P>在Delphi中可以用try...finally...实现一些资源的保护,但C++Builder中好象没有try...finally  

      这样的语法结构, 所以,在程序中为了正确释放内存等临时资源,不得不在有可能出错的任何地方书写释放语句delete,以保护有限的资源。  

      其实有一个较简单的方法可以一劳永逸,即为临时资源定义一个公共的类,将C++的new / delete语句稍作封装即可,类的定义如下: 

      <P>TMemory{<BR> 

      <DIR>public:<BR>&nbsp;void *ptr;<BR>public:<BR>&nbsp;TMemory(int size){  

      ptr=(void*)new char[size];  

      _WINAPI_::ZeroMemory(ptr,size);}<BR>&nbsp;~TMemory(void){ if(ptr) delete  

      ptr; }<BR></DIR>};<BR>应用示例如下:<BR>void TMainForm::function(int  

      size)<BR>{<BR> 

      <DIR>TMemory mem(size); //注意捕获异常:EOutOfMemory!<BR>char *str=(char  

      *)mem.ptr; //取得分配的内存指针<BR>some_func(str); //其它操作<BR>return;  

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

      <P><FONT color=#000000>如何简化等待光标的的设置与还原 ?  

      <HR noShade SIZE=1 width="100%"> 

      </FONT> 

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

      <P>#pragma warn -bei //关闭枚举变量赋值的警告<BR>class  

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

      <DIR>private:<BR>&nbsp;TCursor oldc;<BR>public:  

      <BR>&nbsp;TWaitCursor(void) : oldc(Screen-&gt;Cursor){ Screen-&gt;Cursor =  

      crHourGlass; }<BR>&nbsp;~TWaitCursor(void){ Screen-&gt;Cursor = oldc;  

      }<BR></DIR>};<BR>应用示例如下:<BR>void TMainForm::function(void)<BR>{<BR> 

      <DIR>some_opr(...); //其它操作<BR>TWaitCursor waitit;  

      //变为等待光标<BR>some_func(...); //其它操作<BR>return; //直接返回,光标会自动还原<BR></DIR>} 

      <P>当创建TWaitCursor类的临时变量时,光标会改为等待状态,当该函数返回时,会自动还原光标。<BR>注:创建自动变量时应采用如下方式,以避免Borland编译器的自动优化:<BR> 

      <DIR>TWaitCursor wait;<BR></DIR>而不能定义成下面的样子:<BR> 

      <DIR>TWaitCursor wait();<BR></DIR></TD></TR> 

  </TBODY></TABLE> 

<P>&nbsp;</P></BODY></HTML> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -