What is The Rule of Three?提到C++需要析構函數
執行析構函數的身體,摧毀任何自動對象 身體內的分配之後,X類析構函數調用的 X的直接[析構函數... ]成員[n3126.pdf 12.4§6]
這讓我想知道,如果不摧毀成員,析構函數的用法是什麼?請提供示例
What is The Rule of Three?提到C++需要析構函數
執行析構函數的身體,摧毀任何自動對象 身體內的分配之後,X類析構函數調用的 X的直接[析構函數... ]成員[n3126.pdf 12.4§6]
這讓我想知道,如果不摧毀成員,析構函數的用法是什麼?請提供示例
這是額外的清理,成員本身不負責。或者在資源管理的情況下確保與他對象相關的資源被正確釋放。請記住並非所有成員都會調用析構函數(指針沒有析構函數)。所以如果你有指針,你需要手動管理它們。
帶指針的示例資源管理。
shared_ptr::~shared_ptr()
{
if (decrementReferenceCountAndCheckForZero())
{
cleanupResources();
}
}
例子。使用框架。沒有一個成員知道框架,但工作人員知道。
MyWorker::MyWorker()
{
Framwork::Register(this);
}
MyWorker::~MyWorker()
{
Framework::Unrigester(this);
}
儘管在框架的情況下,爲了分離責任,你可能需要一個類「FrameworkRegistration」來處理(un)註冊,然後' MyWorker'有一個作爲數據成員。基本上,'Framework :: Unregister'不是一個非常友好的C++接口,但可以很容易地包裝在一個C++友好的界面中。 –
@SteveJessop:完全同意。只是擺動潛在的例子。 –
一旦對象停止存在,任何與需要解除關聯/釋放/特殊處理的類實例關聯的東西。
幾個例子:
所有這些語句的意思是,如果你有作爲
Foo::~Foo()
{
Bar b;
b.do_whatever();
}
那麼b
對象的析構函數中的任何Foo
的成員的析構函數之前運行定義的析構函數。執行析構函數的主體,並且首先銷燬在主體內分配的自動對象,即b
。
這可以幫助你
假設一類是具有動態創建SomeClass的陣列。在你的構造假設你在析構函數創建
someClass * p = new someClass [10] ;
,那麼你會寫
delete []p ;
你的類可以管理資源不通過調用你的對象的數據成員的析構函數釋放。如果是這樣,那麼釋放資源的代碼就屬於您編寫的析構函數。
例如,如果您使用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中,所以如果您要爲標準接口提供一些可選接口,那麼您將編寫自己的類來釋放互斥鎖的唯一原因是。理想情況下,非缺省析構函數的類在你自己的代碼中很少見 - 通常存在的類可以用作數據成員或自動變量,並且它們的析構函數可以完成這些工作。
它說的地方*使用析構函數不是爲了銷燬成員*? –
我認爲你鏈接的問答提供了示例 –
@AlokSave:引用說成員在執行析構函數(的主體)後被銷燬。我認爲這是一個合理的推論,即析構者的(主體)的目的是*不是*來摧毀成員。這也是事實。 –