有效的c++项目11处理对self的赋值
Effective C++ Item 11 handle assignment to self
我正在读这本书,我不明白这两段代码之间的区别。
class Bitmap{...};
class Widget
{
...
private:
Bitmap* m_pb;
};
Widget& Widget::operator=(const Widget& rhs)
{
if (this == &rhs)
{
return *this; // if a self-assignment, do nothing
}
delete pb;
pb = new Bitmap(*rhs.m_pb);
return *this;
}
。迈耶斯说:
如果"new Bitmap"表达式产生异常,则Widget将产生异常最终持有一个指向已删除位图的指针。
是否意味着pd指针指向NULL?
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap* temp = pb;
pb = new Bitmap(*rhs.pb);
delete temp;
return *this;
}
。迈耶斯说:
现在,如果"new Bitmap"抛出异常,pb指针保留不变。
据我所知,temp指针指向与pb指针相同的内存地址。如果"new"抛出异常,pb将指向NULL,下一个句子将删除位图。对吗?我看不出这些实现之间有什么区别。
是否意味着pd指针指向NULL?
。是的。也许吧。指针已经是delete
d,你不能依赖它做什么或不指向,所以你在快速通道上未定义的行为。
据我所知,temp指针指向与pb指针相同的内存地址。如果"new"抛出异常,pb将指向NULL,下一个句子将删除位图。对吗?
如果new
在这里抛出,pb
将处于与之前相同的状态,并且下一个表达式将不会被执行。
我看不出这些实现之间的区别。
在第一个代码片段中,如果new
抛出,pb
指向 delete
d指针。在第二个代码片段中,pb
指向与new
抛出时相同的有效对象。
将temp
分配给与pb
相同的内存位置这一事实不会以任何方式影响pb
。在下一行中,如果Bitmap
构造函数抛出异常,则控制将无法到达赋值部分,因此pb
将保持不变。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值给self的行为
- 有效的c++项目11处理对self的赋值
- c++中带self的复合赋值操作符