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