zoukankan      html  css  js  c++  java
  • 简述 C++深拷贝和浅拷贝

    以下为个人的理解:

    深拷贝和浅拷贝主要是针对指针而言,例如两个指针a和b,令b=a,则此时就是浅拷贝,即只是把指针a的值(32位地址)赋值给了指针b,此时a和b的值相同,它们所指向的是同一块地址,对该地址中的数据的修改会同时影响到a和b。同样的,对a和b中任何一个指针进行释放(delete/free),都会导致另外一个指针指向无效的地址(成为野指针,使用野指针会导致未定义行为)。

    如果想进行深拷贝,则需要使a和b两个指针的值(32位地址)不同,但2个地址中的数据值相同,可以采用先为b分配空间,再赋值的方法。

    一个简单的浅拷贝的例子:

     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int * a = new int;
     6     *a = 1;
     7     int *b = a;//浅拷贝
     8     cout << a << endl << b << endl;//可见指针a和b的值是相同的
     9     cout << *a << endl << *b << endl;//a和b指向的数据值也相同
    10     delete a;//释放a,此时b成为野指针
    11     cout << *b;//未定义行为
    12 }

    以上代码输出为:

    0x11a18b0
    0x11a18b0
    1
    1
    18510576

    简单的深拷贝的例子:

     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int * a = new int;
     6     *a = 1;
     7     int *b = new int;
     8     *b = *a;//深拷贝
     9     cout << a << endl << b << endl;//a和b的值不同
    10     cout << *a << endl << *b << endl;//a和b指向的数据值相同
    11     delete a;//释放a,对b无影响
    12     cout<< *b <<endl;
    13 }

    以上代码输出为:

    0x10118b0
    0x10118c0
    1
    1
    1

  • 相关阅读:
    图形界面 Fedora Core 12/Core 11 How to log in GUI as r
    nis_client.txt
    nis_server.txt
    passwd
    samba.set
    【22.48%】【codeforces 689D】Friends and Subsequences
    【71.76%】【codeforces 732A】Buy a Shovel
    【56.74%】【codeforces 732B】Cormen --- The Best Friend Of a Man
    【43.26%】【codeforces 732C】Sanatorium
    【37.50%】【codeforces 732D】Exams
  • 原文地址:https://www.cnblogs.com/drperry/p/14512365.html
Copyright © 2011-2022 走看看