例外狀況: 釋出的例外狀況中的物件
這篇文章說明的需求和發生例外狀況時釋放物件的方法。 主題包括:
處理例外狀況在本機
擲回例外狀況之後破壞物件
由架構或根據您的應用程式插斷一般程式流程,會擲回的例外狀況。 因此,務必將保存紀錄的物件,讓您可以適當的配置它們的情況下會擲回例外狀況。
有兩種主要的方法,若要執行這項操作。
處理例外狀況在本機使用試 和 攔截關鍵字,消滅所有的物件,用一個陳述式。
摧毀任何物件,在攔截擲回的例外狀況,以進一步處理區塊以外的區域之前的區塊。
這兩種方法是為下列疑難範例的解決方案詳細說明:
void SomeFunc() // Problematic code
{
CPerson* myPerson = new CPerson;
// Do something that might throw an exception.
myPerson->SomeFunc();
// Now destroy the object before exiting.
// If SomeFunc above throws an exception this code will
// not be reached and myPerson will not be deleted.
delete myPerson;
}
當寫入上方, myPerson將不會刪除所擲回例外狀況時SomeFunc。 執行直接跳到下一個外部例外狀況處理常式,略過正常的函式結束和刪除物件的程式碼。 物件的指標超出範圍例外狀況離開函式,並將不會復原物件所佔用的記憶體,只要在程式執行時。 這是記憶體遺漏。 它會使用記憶體診斷來偵測。
處理例外狀況在本機
Try/catch 範例提供避免記憶體遺漏,並確保例外狀況發生時,便會毀損您的物件的防禦性程式設計方法。 舉個例說,在本文前面所示的範例可以改寫如下:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
// Handle the exception locally
e->Delete();
}
// Now destroy the object before exiting.
delete myPerson;
}
這個新的範例會設定例外處理常式攔截到例外狀況,並在本機處理。 然後正常的退出函式並且終結物件。 這個範例的重點是建立環境,以攔截例外狀況時,會以 try/catch 區塊。 沒有區域例外框架,函式將永遠不知道已擲回例外狀況,並不會有機會正常地退出並終結物件。
擲回例外狀況之後破壞物件
若要處理的例外狀況的另一個方法是將它們傳遞至下一個外部例外處理內容。 在您攔截區塊中,您可以進行區域性配置物件的清除,然後的例外狀況擲回供進一步處理。
可能會擲回的函式,或可能不需要解除配置的堆積物件。 如果函式永遠會解除堆積物件配置在正常情況下,傳回前,那麼函式也應該擲回例外狀況之前解除堆積物件。 相反地,如果正常函式不會不地解除配置物件在正常情況下傳回前,然後您必須決定依個案為基礎的堆積物件是否應該被解除配置。
下列範例所示如何區域性配置的物件可以被清除:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
e->ReportError();
// Destroy the object before passing exception on.
delete myPerson;
// Throw the exception to the next handler.
throw;
}
// On normal exits, destroy the object.
delete myPerson;
}
例外狀況機制會自動解除配置的畫面格物件; 也稱為框架物件的解構函式。
如果您呼叫函式可以擲回例外狀況時,您可以使用 try/catch 區塊來確定攔截的例外狀況,而且有機會終結任何已經建立的物件。 特別是,要知道許多 MFC 函式可以擲回例外狀況。
如需詳細資訊,請參閱的例外狀況: 攔截和刪除例外狀況。