[英]RAII objects tr1:shared_ptr
我正在閱讀Scott Meyrses的C ++,並遇到以下代碼:
class Lock {
public:
explicit Lock(Mutex *pm) // init shared_ptr with the Mutex
: mutexPtr(pm, unlock) // to point to and the unlock func
{
lock(mutexPtr.get()); // see Item15 for info on “get”
}
private:
std::tr1::shared_ptr<Mutex> mutexPtr; // use shared_ptr
}; // instead of raw pointer
他在一個腳注中說該代碼不是異常安全的。 因此,在他的博客中,他建議修改calss的構造函數,如下所示:
explicit Lock(Mutex *pm)
{
lock(pm);
mutexPtr.reset(pm, unlock);
}
尚不清楚為什么此代碼應起作用。 我們在尚未初始化的mutextPtr
上調用reset方法(已從ctor-initializer中刪除了該條目)。 為什么我們不能得到謊言Segmenetation fault
?
mutexPtr
尚未初始化。 當您將某些東西排除在初始值設定項列表之外時,將調用其默認構造函數(如果有)。 shared_ptr
具有默認構造函數,該構造函數將保留的指針設置為null(即,不管理任何對象)。 reset
呼叫然后將其設置為管理pm
。 什么都沒有刪除,因為什么也沒保留。 即使delete
了呼吁舉行指針, delete
上一個空指針是一個空操作,所以它不是一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.