Я читаю Скотта Meyrses' C++ и наткнулся на следующий код:RAII объектов tr1: shared_ptr
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
(мы удалили запись из ctor-initializer). Почему мы не получим что-то ложное Segmenetation fault
?
'std :: tr1' устарел, как и книга. Я бы порекомендовал вам перейти на [Эффективный современный C++] (http://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996), если вы довольны стилем Скотта Мейерса или чем-то вроде [здесь] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – nwp