美文网首页
C++ 深拷贝与浅拷贝原理

C++ 深拷贝与浅拷贝原理

作者: Dalvik_ | 来源:发表于2021-03-30 15:28 被阅读0次

1 拷贝构造函数执行流程
过程分析:对象赋值会调用拷贝构造函数

#include <iostream>
#include<string.h>

using namespace std;

class Student {
public:
    Student() { cout << "空参数构造函数" << endl; }

    Student(char *name, int age) {
        this->name = (char *) malloc(sizeof(char *) * 10);
        strcpy(this->name, name);
        // this->name = name;
        this->age = age;
        cout << "两个参数构造函数" << endl;
    }

    Student(char *name) : Student(name, 99) {
        cout << "一个参数构造函数" << endl;
    }

    ~Student() {
        cout << "析构函数" << endl;
    }

    Student(const Student &student1) {
        cout << "拷贝构造函数 &stu:" << &student1 << " this:" << this << endl;
        //【浅拷贝】:新地址name  旧地址name 指向同一个空间,会造成,重复free的问题,引发奔溃
        this->name = student1.name;
        this->age = student1.age;
    }

private:
    char *name;
    int age;
public:
    char *getName() {
        return this->name;
    }

    void setName(char *name) {
        this->name = name;
    }

    int getAge() {
        return age;
    }

    void setAge(int age) {
        this->age = age;
    }
};


Student getStudent(char *name) {
    Student stu(name); // 旧地址
    cout << "getStudent函数:" << &stu << endl; // 旧地址
    return stu; // stu 旧地址
} // 弹栈 释放 栈成员 stu

void showStudent(Student stu) { //执行拷贝构造函数 函数出栈 释放资源
    cout << "showStudent函数:" << &stu << "  " << stu.getName() << "," << stu.getAge() << endl;
}


int main() {
    Student student1;
    Student student2;
    cout << &student1 << endl;
    cout << &student2 << endl;
    cout << endl;
    Student student3("刘大海");
    Student student4 = student3; //会调用拷贝构造函数

    cout << &student3 << endl;
    cout << &student4 << endl;

    return 0;
}

输出:
空参数构造函数
空参数构造函数
0x61fd60
0x61fd50

空参数构造函数
拷贝构造函数
0x61fd40
0x61fd30
析构函数
析构函数
析构函数
析构函数

2.浅拷贝流程

Student(const Student &student1) {
        cout << "拷贝构造函数 &stu:" << &student1 << " this:" << this << endl;
        this->name = student1.name;
        this->age = student1.age;
    }

3.浅拷贝执行崩溃原因分析
多次释放资源会导致程序崩溃

void showStudent(Student stu) { //执行拷贝构造函数 函数出栈 释放资源
    cout << "showStudent函数:" << &stu << "  " << stu.getName() << "," << stu.getAge() << endl;
}
Student(const Student &student1) {
        cout << "拷贝构造函数 &stu:" << &student1 << " this:" << this << endl;
        //【浅拷贝】:新地址name  旧地址name 指向同一个空间,会造成,重复free的问题,引发奔溃
        this->name = student1.name;
        this->age = student1.age;
    }

4.深拷贝流程

 Student(const Student &student1) {
        cout << "拷贝构造函数 &stu:" << &student1 << " this:" << this << endl;
        //【浅拷贝】:新地址name  旧地址name 指向同一个空间,会造成,重复free的问题,引发奔溃
        // this->name = student1.name;

        // 【深拷贝】
        this->name = (char *) malloc(sizeof(char *) * 10);
        strcpy(this->name, name);
        this->age = student1.age;
    }

5.默认拷贝构造函数是浅拷贝
如果有堆成员变量,必须覆盖拷贝构造函数,实现深拷贝

相关文章

  • [C++之旅] 15 深拷贝与浅拷贝

    [C++之旅] 15 深拷贝与浅拷贝 拷贝构造函数分为深拷贝和浅拷贝两种方式 浅拷贝只是将被拷贝的对象的成员直接赋...

  • c/c++/c++11 浅拷贝和深拷贝

    目录 1 c++拷贝 1.1 拷贝构造函数1.2 浅拷贝1.3 深拷贝 2 c语言拷贝 2.1 浅拷贝2.2 深拷...

  • C++ 深拷贝与浅拷贝原理

    1 拷贝构造函数执行流程过程分析:对象赋值会调用拷贝构造函数 2.浅拷贝流程 3.浅拷贝执行崩溃原因分析多次释放资...

  • 面试:Object 方法与原理

    Object 方法与原理 1. clone 方法 clone 方法的用法是对象的浅拷贝和深拷贝,clone是浅拷贝...

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • 认识js下的浅拷贝与深拷贝

    浅拷贝与深拷贝 首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只拷贝一...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解iOS ...

  • 深拷贝和浅拷贝

    干货!深拷贝和浅拷贝的区别 深拷贝才是拷贝,浅拷贝就是Retain Copy与Retain的区别 Copy: 根据...

  • js浅拷贝、深拷贝

    前言 本文主要简单讲一下什么是浅拷贝、什么是深拷贝、深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝。 一...

网友评论

      本文标题:C++ 深拷贝与浅拷贝原理

      本文链接:https://www.haomeiwen.com/subject/kjdccltx.html