首页 > 其他分享 >浅拷贝与深拷贝

浅拷贝与深拷贝

时间:2024-06-07 11:36:16浏览次数:17  
标签:const char other MyClass 拷贝 data

浅拷贝过程最大的问题是共享同一块内存,容易引发内存问题,下面这个例子就是浅拷贝在析构的时候出现段错误。

#include <iostream>
#include <cstring> // for strcpy_s
#include <thread>
class MyClass {
public:
    char* data;

    MyClass(const char* str) {
        data = new char[strlen(str) + 1];
        strcpy_s(data, strlen(str) + 1, str);
    }

    // 浅拷贝构造函数
    MyClass(const MyClass& other) {
        data = other.data;
    }

    // 深拷贝构造函数
    MyClass(const MyClass& other, bool deepCopy) {
        if (deepCopy) {
            data = new char[strlen(other.data) + 1];
            strcpy_s(data, strlen(other.data) + 1, other.data); 
        }
        else {
            data = other.data;
        }
    }

    ~MyClass() {
        delete[] data;
    }

    void print() const {
        std::cout << data << std::endl;
    }
};

int main() {
    MyClass obj1("Hello, World!");

    // 浅拷贝
    MyClass obj2(obj1);
    std::cout << "After shallow copy:" << std::endl;
    obj1.print();
    obj2.print();

    //修改obj2数据
    obj2.data[0] = 'a';
    std::cout << "After modifying obj2's data:" << std::endl;
    obj1.print(); // obj1不会被修改
    obj2.print();

    // 深拷贝
    MyClass obj3(obj1, true);
    std::cout << "After deep copy:" << std::endl;
    obj1.print();
    obj3.print();

    // 修改obj3的数据
    obj3.data[0] = 'b';
    std::cout << "After modifying obj3's data:" << std::endl;
    obj1.print(); // obj1不会被修改
    obj3.print();

    //在此之前程序正常输出,但是在程序退出的时候,析构函数导致浅拷贝过程中的内存释放出错。
    std::this_thread::sleep_for(std::chrono::seconds(3));
    return 0;
}

标签:const,char,other,MyClass,拷贝,data
From: https://blog.csdn.net/qq_39054069/article/details/139515116

相关文章

  • 用fscanf\fprintf fgetc\fputc fgets\fputs实现文件拷贝。
     1.fscanf\fprintf#include<stdio.h>intmain(intargc,constchar*argv[]){FILE*fp=fopen("./1.c","r");if(NULL==fp){perror("fopen");return-1;}FILE*fp1=fopen......
  • 手写深拷贝
    JSON不支持日期、正则、undefined、函数,环结构JSON.parse(JSON.stringify(obj))JS深拷贝(递归、判断类型、避免环)constcloneDeep=(a,cache)=>{if(!cache){cache=newMap();//避免全局变量,仅第一次拷贝创建}if(cache.get(a)){//避免环......
  • “深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“
        前言:在Java编程中,深拷贝(DeepCopy)与浅拷贝(ShallowCopy)是两个非常重要的概念。它们涉及到对象在内存中的复制方式,对于理解对象的引用、内存管理以及数据安全都至关重要。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-C......
  • 『手撕Vue-CLI』拷贝模板
    开篇经过上篇文章的介绍,实现了可以根据用户选择的模板名称加上对应的版本号,可以下载对应的模板,并且将下载之后的文件存放在用户目录下的.nue-template文件夹中。接下来这篇文章主要实现内容是将下载的模板文件拷贝到当前所执行命令的目录下。拷贝模板例如我现在在终端当中输......
  • Postman 拷贝 curl 不识别 --data-raw
    postman:请求路径:   拷贝出来的curl:curl--location--requestPOST'http://xxxxxxxxxxxxx/xxx/xxx'\--header'Content-Type:application/json'\--data-raw'{"query":{"bool":{"must":[......
  • 利用 word VBA 将投标文件偏离参数表列数据拷贝至技术偏差表中
    使用vba将正偏离参数表的第一列信息复制粘贴至对应的技术偏离表的第4列中。需要同时打开两个word文件,在技术偏差表中打开VBE(可以用ctrl+f11快捷键),插入模块。忽略格式的方式,SubCopyDataToTable()Windows("正偏离参数表.docx").ActivateFori=1ToActiveDoc......
  • 【C++修行之道】类和对象(三)拷贝构造函数
    目录一、 概念二、特征 正确的拷贝构造函数写法:拷贝函数的另一种写法 三、若未显式定义,编译器会生成默认的拷贝构造函数。四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?深拷贝的写法:五、拷贝构造函数典型调用场景:六、总结:......
  • linux零拷贝
    什么是零拷贝零拷贝(Zero-Copy)就是一种避免CPU将数据从一块存储拷贝到另外一块存储的技术,是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝的好处避免操作系统内核缓冲区之间进行数据拷贝操作避免操作系统内核和用户应用程序地址空间这两者之间进......
  • Java浅拷贝大揭秘:如何轻松复制两个不同对象的某些相同属性
    哈喽,大家好,我是木头左!一、引言在Java编程中,经常会遇到需要复制一个对象的属性到另一个对象的情况。这时,可以使用浅拷贝(ShallowCopy)来实现这个需求。那么,什么是浅拷贝呢?浅拷贝是指创建一个新对象,然后将原对象的非静态字段复制到新对象中。这样,新对象和原对象就会有相同的字段......
  • 深拷贝和浅拷贝
    在C++中,对象的拷贝可以通过浅拷贝(ShallowCopy)和深拷贝(DeepCopy)来实现。这两种拷贝方式在处理对象中的指针成员时有着根本的区别。浅拷贝(ShallowCopy)浅拷贝简单地复制一个对象的所有字段到另一个对象。如果对象中有指针成员,那么浅拷贝会复制指针的值,而不是指针指向的数......