自赋值相关问题
- 自赋值情况示例
- 明显的自赋值如
w = w
,还有不太容易辨别的情况,像a[i] = a[j]
(当i
和j
值相同)、*px = *py
(当px
和py
指向同一对象)等,这些是由别名(有多种引用对象的方式)造成的,尤其在涉及引用、指针操作同类型多个对象以及继承体系中基类和派生类对象引用、指针转换时要考虑自赋值可能。
- 明显的自赋值如
- 自赋值在资源管理类中的隐患
- 以
Widget
类持有指向动态分配位图的裸指针pb
为例,若operator=
实现时未考虑自赋值情况,像最初不安全的实现:先delete pb
再new Bitmap(*rhs.pb)
,当*this
和rhs
是同一个对象时,会导致删除了不该删除的资源(同时破坏了rhs
的资源),最终使对象持有指向已删除对象的 “有毒” 指针。 -
Widget& Widget::operator=(const Widget& rhs) // unsafe impl. of operator= { delete pb; // stop using current bitmap pb =
- 以