我对这个赋值操作符错误的假设是正确的吗?
Am I correct in my assumption about an error on this assignment operator?
Richard Gillam在他的"The Anatomy of The Assignment Operator"中,在他论文的开头说了下面这段话,他可能说错了:
"这个问题的正确答案应该是这样的:"
TFoo&TFoo::operator=(const TFoo& that)
{
if (this != &that)
{
TBar* bar1 = 0;
TBar* bar2 = 0;
try
{
bar1 = new TBar(*that.fBar1);
bar2 = new TBar(*that.fBar2);
}
catch (...)
{
delete bar1;
delete bar2;
throw;
}
TSuperFoo::operator=(that);
delete fBar1;
fBar1 = bar1;
delete fBar2;
fBar2 = bar2;
}
return *this;
}
我认为作者错了,因为如果TSuperFoo::operator=()
抛出,bar1
和bar2
将会泄漏。
如果看起来像这样,就不会有内存泄漏:
Tbar* pBar = NULL;
try
{
pBar = new Tbar();
}
catch (...)
{
delete pBar; // clean memory if it was allocated
throw; // error was not handled properly, throw it to caller
}
delete pBar; // no exception was caught, clean the memory
但是如果在最后一个delete
之前,有另一个代码可能抛出异常,那么您是对的,并且确实存在导致内存泄漏的可能路径,因为在这种情况下,分配的内存将永远不会被清理。
令人遗憾的是,人们编写的代码没有使用这种语言提供的优秀特性来避免如此丑陋的内存管理。通常,具有自动存储持续时间的对象就足够了,您将发现自己遵循RAII习惯用法,或者在需要动态分配的情况下,将这些裸指针与一些对象包装起来仍然是一个好主意……智能指针很有帮助。
相关文章:
- c++中的重载赋值操作符
- c++类继承和赋值操作符
- 带引用类成员的赋值操作符
- 复制构造函数,赋值操作符重载
- c++派生类赋值操作符
- 通过调用Move赋值操作符实现Move构造函数
- 带有映射的赋值操作符
- 单参数构造函数和赋值操作符
- 如何从复制赋值操作符调用复制构造函数
- c++复制构造函数,重载赋值操作符,方法get()
- 用于具有const数据成员的类的move和右值赋值操作符
- 类赋值操作符和复制构造函数
- 赋值操作符重载
- 影响正确性的move构造函数/赋值操作符示例
- 当类是子类时重载赋值操作符
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 在类赋值操作符函数中,为什么必须返回*this ?
- 模板类的重载赋值操作符
- 使用重载赋值操作符
- 我对这个赋值操作符错误的假设是正确的吗?