?? 20000916027.htm
字號:
<HTML>
<HEAD>
<TITLE>如何簡化臨時內存的分配與釋放?</TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align="center"><font size="3"><br>
<b>如何簡化臨時內存的分配與釋放?</b></font></p>
<div align="left">
<p align="center"><font color=#000000>王俊蛟</font></p>
<p>描述:在編制 C++ 程序時,最常遇到的一個令人惱火的問題便是臨時資源的分配與釋放問題, 由于程序的邏輯關系通常很復雜,引發異常的可能性也很多,為了妥善處理運行時異常,
我們不得不在可能引發異常的任何地方釋放已分配成功的臨時資源,然后</p>
<p><font color=#000000></font>返回, 以保證程序的健壯穩定及系統的清潔,所以程序中可能隨處可見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>
void *ptr;<br>
public:<br>
TMemory(int size){ ptr=(void*)new char[size]; _WINAPI_::ZeroMemory(ptr,size);}<br>
~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>
TCursor oldc;<br>
public: <br>
TWaitCursor(void) : oldc(Screen->Cursor){ Screen->Cursor
= crHourGlass; }<br>
~TWaitCursor(void){ Screen->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();</dir>
<p> </p>
</div>
</td>
</tr>
</table>
</div>
</BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -