c++自我赋值问题

浏览:24日期:2023-05-05

问题描述

effective第11个条款举的这个例子:

Widget& Widget::operator=(const Widget& rhs) //一份不安全的operator=实现版本 { delete pb; pb = new Bitmap(*rhs.pb); return *this; }

像上面这样写,自我赋值肯定会出现问题,但是为什么要先释放掉pb呢?为什么不直接像下面这样重赋值呢?

Widget& Widget::operator=(const Widget& rhs) //一份不安全的operator=实现版本 { pb = new Bitmap(*rhs.pb); return *this; }

问题解答

回答1:

第二种写法当自我复制时会造成内存泄漏

回答2:

pb的作用就是在可以引用的值和堆上的内存对象之间进行绑定的,你要访问堆上的对象的话,需要通过pb来操作。

c++自我赋值问题

见上图,按照你举得例子,你指示让pb又指向了一个新的堆上内存地址,但之前的你没有显示delete掉,就会产生内存泄漏。

泄漏的一个例子

class BigData{private: int data[1024*1024*128];};int main(){ BigData *p = 0; for (int i = 0; i < 4; ++i) {p = new BigData(); } return 0;}BigData是一个大小为128MB的对象,创建了4个,没释放,则可以看到程序运行期内存一直增长。

相关文章: