欢迎访问响应式个人博客!
男生版
女生版
初遇时,她的微笑,她往日的深情、承诺和傻劲,两个人共度的美丽时刻,一一印在回忆里,今天的感情已经比不上从前,但是我爱着恋着往日的她,舍不得离开!
排行
详情
您当前的位置>首页 > 正文
浅谈深拷贝浅拷贝
2017-09-26 11:59:33   来源:   评论:0 点击:
版权声明:本文为博主原创文章,未经博主允许不得转载。

什么是浅拷贝

其一,浅拷贝只是拷贝了指针,使得两个指针指向同一个地址,这样在对象块结束,调用函数析构的时,会造成同一份资源析构2次,即delete同一块内存2次,造成程序崩溃。

其二,浅拷贝使得obj_dataobj1_data指向同一块内存,任何一方的变动都会影响到另一方。

其三,在释放内存的时候,会造成obj1_data原有的内存没有被释放(这句话,刚开始我不太理解,如果没有走自定义的拷贝构造函数,申请内存空间,A obj1(obj);也不走默认构造函数,走的是默认的拷贝构造函数,何来分配空间直说,更不会造成obj1_data原有的内存没有被释放,这里刚开始我一直有疑问),造成内存泄露。

事实是这样的,当delete obj_data, obj_data内存被释放后,由于之前obj_dataobj1_data指向的是同一个内存空间,obj1_data所指的空间不能在被利用了,delete obj1_data也不会成功,一致已经无法操作该空间,所以导致内存泄露。

深拷贝采用了在堆内存中申请新的空间来存储数据,这样每个可以避免指针悬挂。
下面是博主总结一个深拷贝demo

<script>
    fetch("https://free-api.heweather.com/v5/weather?city=西安&key=c24778e3bb7c49c7860bed0f1665c5b4").then(function(response) {

        return response.json();
    }).then(function(data) {
        console.log(ObjCopy(data))
    }).catch(function(e){
        console.log("Oops, error");
    });
    function ObjCopy(obj) {
        var tmp_obj;
        if (typeof obj == 'object') {
            if (obj instanceof Array) {
                tmp_obj = [];
            } else {
                tmp_obj = {};
            }
        } else {
            return obj;
        }
        for (var i in obj) {
            if (typeof obj[i] != 'object') {
                tmp_obj[i] = obj[i];
            } else if (obj[i] instanceof Array){
                tmp_obj[i] = [];
                for (var j in obj[i]) {
                    if (typeof obj[i][j] != 'object') {
                        tmp_obj[i][j] = obj[i][j];
                    } else {
                        tmp_obj[i][j] = ObjCopy(obj[i][j]);
                    }
                }
            } else {
                tmp_obj[i] = ObjCopy(obj[i]);
            }
        }
        return tmp_obj;
    }

script>

希望能帮到大家

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

相关热词搜索:

上一篇:css边框边框的组成
下一篇:最后一页

收藏