c++自我赋值问题

 恋若寒1999 发布于 2022-11-03 15:13

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;
 }
 
2 个回答
  • pb的作用就是在可以引用的值和堆上的内存对象之间进行绑定的,你要访问堆上的对象的话,需要通过pb来操作。

    见上图,按照你举得例子,你指示让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个,没释放,则可以看到程序运行期内存一直增长。
    2022-11-05 20:22 回答
  • 第二种写法当自我复制时会造成内存泄漏

    2022-11-05 20:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有