一般导致程序崩溃的最重要原因之一就是试图解引用NULL指针。正如上几篇文章中所说的,智能指针RefCountPtr和ScopedPtr提供了运行时的诊断。但是,并不是所有的指针都是拥有某个对象所有的智能指针。因此为了对试图解引用一个不具有对象所有权的指针的行为进行诊断,引入一种并不删除它所指向的对象的“半智能”指针。例如,如下代码示例:
template <typename T>
class Ptr
{
public:
explicit Ptr(T* p = NULL)
: ptr_(p)
{
}
T* Get() const
{
return ptr_;
}
Ptr<T>& operator=(T* p)
{
ptr_ = p;
return *this;
}
T* operator->() const
{
SCPP_TEST_ASSERT(ptr_ != NULL,
"Attempt to use operator -> on NULL pointer.");
return ptr_;
}
T& operator*() const
{
SCPP_TEST_ASSERT(ptr_ != NULL,
"Attempt to use operator * on NULL pointer.");
return *ptr_;
}
private:
T* ptr_;
};
尽管出现了操作符=,但它并不是告诉编译器当我们试图把一个Ptr<T>赋值给