2013-05-27 73 views
1

What is The Rule of Three?提到C++需要析構函數

執行析構函數的身體,摧毀任何自動對象 身體內的分配之後,X類析構函數調用的 X的直接[析構函數... ]成員[n3126.pdf 12.4§6]

這讓我想知道,如果不摧毀成員,析構函數的用法是什麼?請提供示例

+0

它說的地方*使用析構函數不是爲了銷燬成員*? –

+0

我認爲你鏈接的問答提供了示例 –

+0

@AlokSave:引用說成員在執行析構函數(的主體)後被銷燬。我認爲這是一個合理的推論,即析構者的(主體)的目的是*不是*來摧毀成員。這也是事實。 –

回答

3

這是額外的清理,成員本身不負責。或者在資源管理的情況下確保與他對象相關的資源被正確釋放。請記住並非所有成員都會調用析構函數(指針沒有析構函數)。所以如果你有指針,你需要手動管理它們。

帶指針的示例資源管理。

shared_ptr::~shared_ptr() 
{ 
    if (decrementReferenceCountAndCheckForZero()) 
    { 
     cleanupResources(); 
    } 
} 

例子。使用框架。沒有一個成員知道框架,但工作人員知道。

MyWorker::MyWorker() 
{ 
    Framwork::Register(this); 
} 
MyWorker::~MyWorker() 
{ 
    Framework::Unrigester(this); 
} 
+0

儘管在框架的情況下,爲了分離責任,你可能需要一個類「FrameworkRegistration」來處理(un)註冊,然後' MyWorker'有一個作爲數據成員。基本上,'Framework :: Unregister'不是一個非常友好的C++接口,但可以很容易地包裝在一個C++友好的界面中。 –

+0

@SteveJessop:完全同意。只是擺動潛在的例子。 –

-1

析構函數是一種在對象被銷燬時自動調用的方法。 Wikipedia

它不會銷燬對象,但會在銷燬時開始工作。對於它,你必須使用別的東西。

+0

我知道它何時被調用。我在問什麼代碼放在析構函數中? – prongs

+0

我不明白。無論你想要什麼,你都可以放入它,就像在構造函數中一樣。 –

+0

實際上,「什麼是什麼」,就是我想知道的 – prongs

2

一旦對象停止存在,任何與需要解除關聯/釋放/特殊處理的類實例關聯的東西。
幾個例子:

  • 文件句柄打開,擁有和實例使用,並不會被使用對象後銷燬。
  • 由類實例打開並擁有的Socktes,mutex等。
1

所有這些語句的意思是,如果你有作爲

Foo::~Foo() 
{ 
    Bar b; 
    b.do_whatever(); 
} 

那麼b對象的析構函數中的任何Foo的成員的析構函數之前運行定義的析構函數。執行析構函數的主體,並且首先銷燬在主體內分配的自動對象,即b

0

這可以幫助你

假設一類是具有動態創建SomeClass的陣列。在你的構造假設你在析構函數創建

someClass * p = new someClass [10] ; 

,那麼你會寫

delete []p ; 
1

你的類可以管理資源通過調用你的對象的數據成員的析構函數釋放。如果是這樣,那麼釋放資源的代碼就屬於您編寫的析構函數。

例如,如果您使用new分配對象,則必須使用delete來釋放對象。如果您使用fopen打開文件,那麼它將以fclose關閉。如果您使用pthread_mutex_lock進行Posix互斥,那麼它必須與pthread_mutex_unlock一起發佈。

對於每一種需要釋放資源(或其他人)的資源,都可以編寫一個管理和釋放資源的類,並提供對其基本操作的訪問。因此存在類似std::unique_ptr,std::shared_ptr,std::lock_guard,std::fstream。當然,爲了簡單起見,您通常只需要一個類來管理特定類型的資源。因此,由於std::lock_guard存在於C++ 11中,所以如果您要爲標準接口提供一些可選接口,那麼您將編寫自己的類來釋放互斥鎖的唯一原因是。理想情況下,非缺省析構函數的類在你自己的代碼中很少見 - 通常存在的類可以用作數據成員或自動變量,並且它們的析構函數可以完成這些工作。