当前位置: 首页 > news >正文

C++什么是深复制和浅复制,构造函数和析构函数,哪一个可以写成虚函数,为什么?

在C++之中深复制是指对于值类型复制它的值,对于指针类型不仅仅复制指针指向的值,还会重新分配一个内存空间用于放置复制的值(对动态分配的内存进行重新分配和内存复制),这种深复制不会出现悬空指针的问题,但是C++的浅拷贝可能会出现悬空指针的问题,下面来分析一下原因:

由于C++的浅拷贝是对于int等数值类型复制数值,对于指针类型复制内存地址,那么对于不同的指针可能会存在指向同一个内存地址的问题,如果删除了其中一个,另外一个则会出现悬空指针的问题。

对于C++之中的构造函数和析构函数,哪一个可以写成虚函数,答案是析构函数,下面来分析:

对于C++之中的析构函数,我们都建议将其写成虚函数,原因在于在C++之中如果声明一个基类,指向一个派生类,如果不制作成虚函数,那么只会调用基类的析构函数,派生类之中可能需要释放的一些资源不会被正确的释放,这可能会产生C++内存泄漏,(注意内存泄漏不是真正的漏出去,而是只一些资源不能再被回收,之前的博客之中也有对这方面进行讲解)

对于构造函数为什么不能写成虚函数呢,原因在于,构造函数调用时对象还没有完成生成好,虚函数是在对象的虚函数表之中调用的,构造函数调用是虚函数表还没有构建好,所以无法将构造函数写成虚函数。

作为一名unity开发工程师,我们开始思考C++与C#的区别在哪里。

对于C#来说,深拷贝就是对值类型拷贝他的值,对于引用类型拷贝重新分配内存空间并且复制他 的值,这一点和C++之中的概念类似(C#的深拷贝和浅拷贝在之前的博客之中有详细描述)

对于C#来说,存在构造函数以及析构函数(终结器),但是他与C++不同的 是,C#的构造函数和析构函数都不可以做成虚函数,构造函数不能的原因和C++大致相同,析构函数不能做成虚函数是由于C#之中使用GC进行自动的垃圾回收机制,我们一般不知道系统会在何时调用,所以不将这部分制成虚函数,另一方面,终结器一般用于释放非托管资源,一般不设计使用虚函数进行多态调用)

(由于书写匆忙可能存在笔误,欢迎指正)

相关文章:

  • 轻量级 Transformer 架构多模态预训练框架
  • 完全背包(排列问题)——爬楼梯
  • 模拟退火算法(Simulated Annealing):从物理学到优化的经典方法
  • leetcode刷题--超详解
  • 力扣203题:移除链表元素及代码实现分析
  • PAT线上考试注意细节(甲/乙级)
  • JDBC连接池技术详解
  • Linux网络基础
  • 【数据结构初阶第十八节】八大排序系列(上篇)—[详细动态图解+代码解析]
  • 在人工智能软件的帮助下学习编程实例
  • 力扣 Hot 100 刷题记录 - 随机链表的复制
  • 力扣hot100——多维动态规划
  • 线性代数笔记28--奇异值分解(SVD)
  • 揭开AI-OPS 的神秘面纱 第四讲 AI 模型服务层(自研方向)
  • QT快速入门-信号与槽
  • 34.二叉树进阶3(平衡二叉搜索树 - AVL树及其旋转操作图解)
  • Flask框架中局部刷新页面
  • 北斗短报文+5G:遨游通信终端开启全域智能物联新时代
  • RAG技术的PDF智能问答系统
  • Effective Python:(18)作用域问题
  • 新型建房有哪几种/seo排名优化软件免费
  • 网站做微信链接怎么做的/nba西部排名
  • 网站建设制作浩森宇特/搜索引擎大全网址
  • 抖音网站/什么是网站推广优化
  • 申请建设网站的请示/百度网址大全怎么设为主页
  • 建设局网站施工合同范本/怎么查询搜索关键词