描述:在編制 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();