如何简化临时内存的分配与释放
描述:在編制 C++ 程序時,最常遇到的一個令人惱火的問題便是臨時資源的分配與釋放問題, 由于程序的邏輯關系通常很復雜,引發(fā)異常的可能性也很多,為了妥善處理運行時異常, 我們不得不在可能引發(fā)異常的任何地方釋放已分配成功的臨時資源,然后返回, 以保證程序的健壯穩(wěn)定及系統(tǒng)的清潔,所以程序中可能隨處可見delete、free等語句, 顯得很繁! 那么有沒有辦法使得只顧分配、使用臨時資源,而不顧其后事如何呢?
在Delphi中可以用try...finally...實現(xiàn)一些資源的保護,但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中發(fā)生異常同樣會自動釋放內存 }
如何簡化等待光標的的設置與還原 ?
--------------------------------------------------------------------------------
解決問題的原理同上,類的定義如下:
#pragma warn -bei //關閉枚舉變量賦值的警告 class TWaitCursor{//自動處理等待光標,當函數(shù)調用棧解體時自動還原光標 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; //變?yōu)榈却鈽?some_func(...); //其它操作 return; //直接返回,光標會自動還原 }
當創(chuàng)建TWaitCursor類的臨時變量時,光標會改為等待狀態(tài),當該函數(shù)返回時,會自動還原光標。
注:創(chuàng)建自動變量時應采用如下方式,以避免Borland編譯器的自動優(yōu)化:
TWaitCursor wait;
而不能定義成下面的樣子:
TWaitCursor wait();
總結
以上是生活随笔為你收集整理的如何简化临时内存的分配与释放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 函数传递指针参数注意事项
- 下一篇: 但有很多的HTML5朋友