关于 运算符=() 来自 Meyers 的书
About operator=() from Meyers's book
我正在读S. Meyers的书"有效C++。55种具体方式..."(第3版)。这本书中的某些内容,在规则 11 中我不明白。因此,在下一个代码部分中:
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb)
delete pOrig;
return *this;
}
为什么使用"pOrig"?
附言对不起我的英语不好。
当您在这里处理原始指针时,您必须进行适当的资源管理。在这种情况下,new Bitmap(...)
可能会抛出,例如,如果进程内存不足,它不会更改 pb 指向的值,因为异常将在分配发生之前触发。
通过引入临时对象,您仍然可以正确管理 Bitmap 对象,因为如果对 new
的调用成功,旧对象将被删除,并且不会泄漏内存。
如果首先删除 pb 指向的对象,并且new Bitmap...
代码导致异常,则对象处于内部混乱状态。
此外,正如 Angew 在评论中指出的那样,通过使用临时来保持内部状态一致,您还可以防止自我分配,并且可以跳过自我分配测试作为附带好处。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 2D数组来自文本输入,中间有空格
- 通过继承类使用来自不同命名空间的运算符
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- C++:来自外部文件的Trivia
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 针对遗留库的链接:来自预制makefile的-lgfortranbegin
- 如何在C++中正确引用来自不同类的类的对象?
- Qt中来自不同功能的按钮引用
- C++包含来自 #include "DevEngine/Core.h" 的错误
- Eigen c++ 三角形来自
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- 如何多次询问来自QML对话框的输入?
- 如何强制 Thrift 仅接受来自本地主机的连接
- 使 ld 忽略来自 /etc/ld.so.conf 的目录
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 来自colPivHouseholderQr().solve的拟合相关性
- 关于 运算符=() 来自 Meyers 的书