c++自我赋值问题
ringa_lee
ringa_lee 2017-04-17 13:45:27
[C++讨论组]

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;
 }
 
ringa_lee
ringa_lee

ringa_lee

全部回复(2)
ringa_lee

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

PHP中文网

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个,没释放,则可以看到程序运行期内存一直增长。
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号