Effective C++ Item 11
《Efficient C++》Item 11 的 等号赋值这块,确实很多是之前会忽略的东西 —— 比如 a = a 这种看上去有点愚蠢的写法。
赋值写法
书中提供了一种不那么优雅但是可以正常运作的 ——
C++
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}分析 ——
- 首先使用
pOrig来指向pb原来指向的内存空间 - 接着使用
new来实现 " 深拷贝 "- 如果
new抛出异常退出,则pb=这个赋值语句失效,函数返回,因为尚未执行delete语句,所以pb还是原数据
- 如果
delete销毁原pb指向的内存空间,实现资源释放- 函数体执行结束
pOrig在栈空间上自动释放
综上,实现了一次深拷贝的赋值运算,同时规避了旧的pb指向新内存空间导致的内存泄露
写在后面
为什么说它可用但不优雅 —— 一个是可以使用智能指针 RAII 来进行资源管理,另一方面,使用copy‑and‑swap 会更优雅(保证异常安全,)