如何簡化臨時記憶體的分配與釋放

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.