RAII对象tr1:shared_ptr

时间:2015-07-17 04:31:40

标签: c++ raii

我正在阅读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

在脚注中,他说代码不是例外安全的。所以在his blog中,他建议修改calss的构造函数,如下所示:

explicit Lock(Mutex *pm)
{
    lock(pm);
    mutexPtr.reset(pm, unlock);
}

目前还不清楚为什么这段代码应该有效。我们在尚未初始化的mutextPtr上调用reset方法(我们从ctor-initializer中删除了条目)。为什么我们不能说谎Segmenetation fault

1 个答案:

答案 0 :(得分:1)

mutexPtr未初始化。当你从初始化列表中留下一些东西时,会调用它的默认构造函数(如果有的话)。 shared_ptr有一个默认构造函数,它将保持的指针设置为null(即没有对象被管理)。然后,对reset的调用将其设置为管理pm。什么都没有删除,因为什么都没有。即使在保持指针上调用delete,空指针上的delete也是无操作,因此它不是问题。