zoukankan      html  css  js  c++  java
  • c/c++ 浅拷贝

    c/c++ 浅拷贝

    编译器合成的拷贝构造函数=重载函数,只是做如下处理:

    对象1.成员变量a = 对象2.成员变量a 
    

    如果成员变量a是指针,执行完拷贝构造函数或者*=重载函数**后,对象1和对象2的成员变量就指向了一个地址了,所以当改变对象1的a的值,对象2的a的值也变化了,
    而且,如果在析构函数里写了free(a)的话,就相当于对同一个地址free了2次,系统就会在执行时崩溃。

    下面的代码断点执行到return 0处,观察s, s1, s2的data成员变量的地址后,发现都指向同一个地址

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    class String{
     public:
      String(const char* str = ""){
        if(NULL == str){
          data = (char*)malloc(sizeof(char));
          *data = '';
        }
        else{
          data = (char*)malloc(sizeof(char) * (strlen(str) + 1));
          strcpy(data, str);
        }
      }
      ~String(){
        free(data);
        data = NULL;
      }
      char* getData(){
        return data;
      }
     private:
      char *data;
    };
    int main(){
      char* a = "abc";
      String s(a);
    
      String s1(s);
    
      String s2;
      s2 = s;
    
      return 0;
    }
    

    解决办法:编写自己的拷贝构造函数和重载=函数。

    请看下一篇深拷贝

  • 相关阅读:
    C# 数组
    一个遍历算法
    php csv导出
    linux 配置 crontab
    LINUX 配置SVN
    Linux chkconfig命令
    Linux 安装mysql+apache+php
    linux 安装samba
    linux安装软件的学习
    LINUX中简单的字符命令
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9499645.html
Copyright © 2011-2022 走看看