C++深拷贝与浅拷贝

浅拷贝的问题

默认提供的拷贝构造就是浅拷贝,如果拷贝的对象中含有成员指针变量指向堆区中的内存空间,那么就会出现两个对象中的成员指针变量指向同一块堆区空间,当方法执行结束后,对象就会被释放,调用析构函数(析构函数中存在释放在堆区开辟的内存空间),就会存在一块内存空间被多次释放的问题。

解决办法

自己写拷贝构造,让拷贝构造后的对象中的成员指针变量指向一块新的内存空间。
image
image

//
// Created by Administrator on 2023/4/25.
//
#include <iostream>
using namespace std;
// 深拷贝和浅拷贝
class Person {
public:
    int p_age;
    int *p_weight;

    Person() {
        cout << "无参构造" << endl;
    }

    Person(int age, int height) {
        p_age = age;
        p_weight = new int(height);
        cout << "有参构造" << endl;
    }

    // 析构函数 用于释放手动在堆区开辟的空间
    ~Person() {
        if (p_weight != NULL) {
            delete p_weight;
            // 防止野指针
            p_weight = NULL;
        }
        cout << "析构函数" << endl;
    }

    // 拷贝构造 不写让编译器生成
    // 防止 浅拷贝带来的问题 自己写拷贝构造 避免这个问题
    Person(const Person &p) {
        cout << "自己写的拷贝构造,避免浅拷贝的问题" << endl;
        p_age = p.p_age;
        // 这是浅拷贝
        // p_height = p.p_height; 自动生成的就是这样

        // 深拷贝 重新开一块空间 防止出现重复释放的问题
        p_weight = new int(*p.p_weight);
    }
};

void test() {
    Person p1(10, 120);
    cout << "年龄为: " << p1.p_age << ", 体重为: " << *p1.p_weight << endl;
    Person p2(p1);
    cout << "年龄为: " << p2.p_age << ", 体重为: " << *p2.p_weight << endl;
    // 会 先释放p2 在释放p1
    // 释放p2后析构函数会将 堆区中开辟的空间释放了 p1在此执行析构 在此操作那块内存就会报错
}

int main() {
    test();
    return 0;
}

原文链接:https://www.cnblogs.com/ashes001/p/17353524.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++深拷贝与浅拷贝 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月25日

相关文章

  • NX二次开发:Checkmate例子根据dfa文件检查模型数据

    NX中的checkmate功能是用于检查模型、图纸数据的工具,在UGOPEN中有例子。手动操作可以检查已加载的装配下所有零部件,可以设置通过后保存模型,检查结果保存到Teamcenter中,默认保存在零组件版本下。 代码中可以设置多个检查规则。相关设置可以在用户默认设置中进行设置。 1 //============================= 2 //…

    C++ 2023年4月18日
    00
  • 面试最常问的数组转树,树转数组 c++ web框架paozhu实现

    刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考 c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这种功能 二维数组转树,树转二维数组 保存时候树二维数组,展示时候树树状。 这个技术难点在于无限递归,这个树程序基本原理 现在看看c++怎么实现的,无限递归,家肯…

    C++ 2023年4月25日
    00
  • L1-080 乘法口诀数列*(使用C++)

    L1-080 乘法口诀数列 分数 20 全屏浏览题目 切换布局 作者 陈越单位 浙江大学   本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。 输入格式: 输入在一行…

    C++ 2023年4月18日
    00
  • 驱动开发:内核使用IO/DPC定时器

    本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔,微秒级别间隔,就需要用到DPC定时器,如果是秒级定时其两者基本上无任何差异,本章将简单介绍IO/DPC这两种定时器的使用技巧。 首先来看IO…

    C++ 2023年4月18日
    00
  • STL 容器 002 (vector 详解)

    为什么 各方面表现都比较中等, 适用范围广 尾插很快, 查找也比较快 是什么 动态数组 特点: 动态数组, 三个指针控制 两倍增长 扩充的方法: 不能原地扩充, 因为后面可能会有其他的东西, 必须在 其他地方开辟一块更大的内存 提供[] 所有的有连续空间的容器都有[] iterator是class类型的 怎么样 制造 两倍增长 //push_back() 检…

    C++ 2023年4月18日
    00
  • Qt源码阅读(四) 事件循环

    事件系统 文章为本人理解,如有理解不到位之处,烦请各位指正。 @ 目录 事件系统 什么是事件循环? 事件是如何产生的? sendEvent postEvent 事件是如何处理的? 事件循环是怎么遍历的? 事件过滤器 event 夹带私货时间 Qt的事件循环,应该是所有Qter都避不开的一个点,所以,这篇博客,咱们来了解源码中一些关于Qt中事件循环的部分。先抛…

    C++ 2023年4月18日
    00
  • 最少步数

    在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100*100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一…

    C++ 2023年4月25日
    00
  • L1-087 机工士姆斯塔迪奥*(使用C++动态数组new暴力实现)

    L1-087 机工士姆斯塔迪奥 分数 20 全屏浏览题目 切换布局 作者 DAI, Longao单位 杭州百腾教育科技有限公司在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。 你需要处理这个副本其中的一个机制:N×M 大小的地图被拆分为了 N×M 个 1×1 的格子,BOSS 会选择若干行或/及…

    C++ 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部