在operator =中要处理“自我赋值”
2018-05-20 23:59
351 查看
防止自我赋值很有必要
Widget w; w = w; a[i] = a[j]; //a[i]和a[j]实际上指向同一个元素 *pi = *pj; //pi和pj实际上指向同一个元素
自我赋值的危害:
Widget { private: Test *p; }; Widget &Widget::operator=(const Widget &w) { delete p; p = new int (*w.p); return *this; }
如果是自我赋值,会把自己的空间释放掉,即当执行delete p后,w.p已经指向一个被释放的内存空间(此时*w.p的内容未知);当执行 p = new int(*w.p);即让p重新指向一个存储了(*w.p)的内存空间,该内存空间内容又是未知的。当再次引用时,会出现未定义的行为。
改良版本
Widget &Widget::operator=(const Widget &w) { if (this == &w) { return *this; } delete p; p = new Test(*w.p); return *this; };
这个类虽然能避免自我赋值的问题,但是,如果new Test时抛出异常,那么Widget最终会持有一个指针指向一块被删除的内存区域,这样的指针是有害的。
改成这样:
Widget &Widget::operator=(const Widget &rhs) { Test *porg = p; p = new Test(*rhs.p); delete porg; return *this; }
此时new Test发生异常,那么p可以保持原状。(异常发生的时候,不会给p赋值)
delete prog;保证了p原来指向的内存空间也会被顺利释放。
相关文章推荐
- effective c++ Item 11 在operator=中处理自我赋值
- 读书笔记_Effective_C++_条款十一:在operator=中处理自我赋值
- 【11】在operator=中处理“自我赋值”
- 用3种方法在 operator= 中处理“自我赋值”
- 在operator=中处理自我赋值
- Effective C++——》条款11:在operator=中处理自我赋值
- 条款11:在operator = 中处理“自我赋值”
- 条款11:在operator= 中处理“自我赋值”
- Effective C++ Item 11-在operator = 中处理"自我赋值"
- Effective C++ 条款10 令operator=返回一个reference to *this 条款11 在operator=中处理"自我赋值"
- 条款11:在operator=中处理“自我赋值”
- Effective C++ 学记之11 在operator=中处理“自我赋值“
- 条款11:在operator=中处理自我赋值
- effective C++ 11_在operator= 中处理"自我赋值" 读书笔记
- 条款11: 在operator= 中处理"自我赋值"
- 条款11:在operator=中处理“自我赋值”(Handle assignment to self in operator=.)
- Effective C++ -----条款11: 在operator=中处理“自我赋值”
- EC读书笔记系列之6:条款11 在operator=中处理自我赋值
- Effective C++_笔记_条款11_在operator=中处理“自我赋值”
- 读书笔记 effective c++ Item 11 在operator=中处理自我赋值