• C++浅拷贝和深拷贝的区别


    C++浅拷贝和深拷贝的区别

    11454人阅读 评论(6) 收藏 举报

    c++默认的拷贝构造函数是浅拷贝

    浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如:
    class A

    {

    public:

    A(int _data) : data(_data){}

    A(){}
    private:

    int data;

    };
    int main()

    { A a(5), b = a; // 仅仅是数据成员之间的赋值 }


    这一句b = a;就是浅拷贝,执行完这句后b.data = 5;


    如果对象中没有其他的资源(如:堆,文件,系统资源等),则深拷贝和浅拷贝没有什么区别,但当对象中有这些资源时,例子:


    class A

    {

    public:

    A(int _size) : size(_size){data = new int[size];} // 假如其中有一段动态分配的内存

    A(){};

    ~A(){delete [] data;} // 析构时释放资源
    private:

    int* data; int size;

    }
    int main() { A a(5), b = a; // 注意这一句 }


    这里的b = a会造成未定义行为,因为类A中的复制构造函数是编译器生成的,所以b = a执行的是一个浅拷贝过程。我说过浅拷贝是对象数据之间的简单赋值,比如:
    b.size = a.size; b.data = a.data; // Oops!
    这里b的指针data和a的指针指向了堆上的同一块内存,a和b析构时,b先把其data指向的动态分配的内存释放了一次,而后a析构时又将这块已经被释放过的内存再释放一次。
    对同一块动态内存执行2次以上释放的结果是未定义的,所以这将导致内存泄露或程序崩溃。


    所以这里就需要深拷贝来解决这个问题,深拷贝指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。如:
    class A

    {

    public:

    A(int _size) : size(_size)

    {data = new int[size];} // 假如其中有一段动态分配的内存

    A(){};

    A(const A& _A) : size(_A.size){data = new int[size];} // 深拷贝

    ~A(){delete [] data;} // 析构时释放资源


    private:

    int* data; int size;

    }
    int main()

    { A a(5), b = a; // 这次就没问题了 }


    总结:
    深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。

  • 相关阅读:
    分组与子报表Active Report6 使用(二)
    网站开发人员应该知道的62件事[转]
    如何恢复SVN中已删除文件或文件夹
    java中的List排序[转]
    [原]ActiveReport6 for net使用(一)
    Windows XP 不用输入密码自动登录
    IE不加载ActiveX控件的解决办法
    winRAR 打包小技巧
    iis负载均衡与文件同步[网摘]
    ASP.net的PDF打印(水晶报表)[摘]
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3620874.html
Copyright © 2020-2023  润新知