C++深拷贝与浅拷贝

这篇具有很好参考价值的文章主要介绍了C++深拷贝与浅拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浅拷贝的问题

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

解决办法

自己写拷贝构造,让拷贝构造后的对象中的成员指针变量指向一块新的内存空间。
C++深拷贝与浅拷贝
C++深拷贝与浅拷贝文章来源地址https://www.toymoban.com/news/detail-425058.html

//
// 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;
}

到了这里,关于C++深拷贝与浅拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 本篇主要内容:类的6个默认成员函数中的 拷贝构造函数 和 赋值运算符重载 在上篇文章中我们讲到了类的默认成员函数的

    2024年04月17日
    浏览(43)
  • 【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

      拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) ,在用已存在的类类型对象创建新对象时由编译器自动调用。 1. 拷贝构造函数是 构造函数的一个重载形式 ; 2. 拷贝构造函数的 参数只有一个且必须是类类型对象的引用 ,使用传值方式编

    2024年02月03日
    浏览(42)
  • C++深拷贝与浅拷贝

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

    2023年04月25日
    浏览(36)
  • 【python 深拷贝与浅拷贝】

    python 深拷贝与浅拷贝 在用影刀编写流程的时候发现,明明只修改人名为“小张”对应的字典里面的值,但是所有的人名对应的值都被修改了。 第14行,设置键值对,值对应的变量“初始打卡类型字典”是前面流程生成的,还是引用了原来的地方。 用python来复现: 1、如果列

    2024年02月05日
    浏览(36)
  • C++——拷贝构造函数

    (用旧对象去构造新对象) 拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 参数的类型:   值类型(不行,会产生递归); 指针类型(能实现要求,但会出现歧义(感觉a的地址给b构造));

    2024年02月02日
    浏览(35)
  • 【C++】详解拷贝构造

    拷贝构造的功能 写法: 拷贝构造函数的参数为什么是引用类型 系统自动生成的拷贝构造函数 拷贝构造的深拷贝与浅拷贝 概念 浅拷贝: 深拷贝 小结 拷贝构造函数 可以把曾经 实例化好的对象的数据 拷贝给 新创建的数据 ,可见说拷贝构造函数在功能上是构造函数的另一种

    2024年04月24日
    浏览(34)
  • JS之深拷贝与浅拷贝

     深拷贝 与 浅拷贝  针对于 引用类型(Object,Array,Function) 来说的 浅拷贝:在栈中分配一块新内存,拷贝需要拷贝的值,           对简单数据类型,就是拷贝值;对复杂数据类型,就是拷贝了一份栈内存储的堆内存的地址  深拷贝:在堆中重新分配新内存,存储新的拷贝数据

    2024年02月09日
    浏览(44)
  • 『C++成长记』拷贝构造函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 📒1.1拷贝构造函数的概念 📒1.2拷贝构造函数的写法 📒1.3编译器生成的拷贝构造 📒1.4拷贝构造函数的用法 📒1.5拷贝构造函数典型调

    2024年02月04日
    浏览(39)
  • 【C++】:类和对象(下):explicit || 再谈构造函数 || static成员 || 友元 || 内部类 || 匿名对象 || 拷贝对象时的编译器优化问题 || 再次理解类和对象

    🔫类和对象(下篇) 🔫【本节目标】 🔫1. 再谈构造函数 🔫2. Static成员 🔫3. 友元 🔫4. 内部类 🔫5.匿名对象 🔫6.拷贝对象时的一些编译器优化 🔫7. 再次理解类和对象 🏄1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值

    2024年01月21日
    浏览(42)
  • 【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

    上一篇文章我们开始学习类内的默认成员函数, 这里是传送门,有兴趣可以去看看:http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面: 1. 拷贝构造 2. 拷贝构造函数为什么需要引用传参? 3. 深拷贝 4. 初识运算符重载 写在最后: 我们在创建一个对

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包