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

  • 相关阅读:
    1-4 Autolayout
    1-3 UIScrollView
    lua 的语法糖
    javascript文档
    cocos2d 图片模糊
    a*寻路分析
    class按传递时分析
    mac 不再接受预览版提示
    OS X 10.11 El Capitan 三指拖动的开启方法
    mac系统卸载mono
  • 原文地址:https://www.cnblogs.com/drperry/p/14512365.html
Copyright © 2011-2022 走看看