在C++ Primer第四版中讲解智能指针的第424页,有一段关于智能指针中定义赋值操作符的代码。
- HasPtr& operator=(const HasPtr &rhs){
- ++rhs.ptr->use;
- if(--ptr->use == 0)
- delete ptr;
- ptr = rhs.ptr;
- val = rhs.val;
- return *this;
- }
这段定义赋值操作符的代码实际上隐含了一个假设,如果不显示指出的话,很可能会以为本书有一个bug。
也就是说作者的意思是,左操作数和右操作数,不应该指向相同的基础对象。
如果左操作数也指向右操作数所指向的基础对象,而且是以如下的形式定义的。
HasPtr p1(p, i);
HasPtr p2(p, i);
p2 = p1;
语句p2 = p1 将会运行代码中的delete ptr,释放p1,p2所共同指向的基础对象*p。导致错误。