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

初识C++:类和对象 内存管理

本次编译环境为VS2022

文章目录

  • 前言
    • 一.类和对象部分
      • 1.内部类
      • 2.匿名对象
      • 3.编译器优化拷贝构造
    • 二.内存管理
      • 1.C++ new delete 的使用
        • 一.认识new delete
        • 二.operator new // operator delete
        • 三.new和delete的实现原理
        • 四.malloc/free和new/delete的区别
  • 总结

前言

本文 主要是 给类和对象结尾 并且开始C++内存管理的内容
类和对象:内部类 匿名对象 和编译器关于拷贝构造的优化
内存管理:C++ new delete 的使用 以及其与c语言的区别

一.类和对象部分

1.内部类

如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。

内部类默认是外部类的友元类。

内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。

#define_CRT_SECURE_NO_WARNINGS1#include<iostream>usingnamespacestd;classA{private:staticint_k;int_h=1;public:classB{public:voidfoo(constA&a){cout<<_k<<endl;cout<<a._h<<endl;}int_b1;};};intA::_k=1;intmain(){cout<<sizeof(A)<<endl;A::B b;A aa;b.foo(aa);return0;}

来看这段代码 A类里 有一个B类
再看 主函数部分
sizeof(A) 为 int _h 的大小为 4
不包括B类里的内容
再看b.foo(aa)
_k = 1
a._h = 1
可以看到 B类能访问A类 是类似于友元函数的

2.匿名对象

⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。
匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象。

classA{public:A(inta=0):_a(a){cout<<"Aint (a)"<<endl;}~A(){cout<<"~A()"<<endl;}private:int_a;};classSolution{public:intSum_Solution(intn){returnn;}};intmain(){A aa1;A();//匿名对象A(1);//匿名对象Aaa2(1);}

注释地方为匿名对象
匿名对象 生命周期就在这一行
直接调用函数 并且析构

3.编译器优化拷贝构造

这段内容用文字来说明

现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返回值的过程中可以省略的拷⻉。

如何优化C++标准并没有严格规定,各个编译器会根据情况⾃⾏处理。当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译器还会进⾏跨⾏跨表达式的合并优化。

linux下可以将下⾯代码拷⻉到test.cpp⽂件,编译时⽤ g++ test.cpp -fno-elideconstructors 的⽅式关闭构造相关的优化。

二.内存管理

1.C++ new delete 的使用

一.认识new delete

通过简单代码来了解new和delete

intmain(){int*ptr1=newint;//通过new动态申请空间int*ptr2=newint(10);//申请空间 并初始化为10int*ptr3=newint[3];deleteptr1;deleteptr2;deleteptr3;}

这是new完后的 调试情况 就是开辟空间 而且 new会调用构造函数
不难理解 delete 也就是销毁后 要调用 析构函数了

二.operator new // operator delete

operator new operator delete 是系统提供的全局函数
new在底层调用operator new全局函数来申请空间
delete在底层通过operator delete全局函数来释放空间。
operator new 底层是通过 malloc来实现的
operator delete 是通过free来实现的

三.new和delete的实现原理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

new的原理

  1. 调用operator new函数申请空间
  2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理

  1. 在空间上执行析构函数,完成对象中资源的清理工作
  2. 调用operator delete函数释放对象的空间

new T[N]的原理

  1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
  2. 在申请的空间上执行N次构造函数

delete[]的原理

  1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
  2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
四.malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地
方是:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可、如果是多个对象,[]中指定对象个数即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放

总结

给类和对象 结尾 并且 学习了 new 和delete 在c++的使用
区别了 C语言和C++开辟空间的方式!

http://www.jsqmd.com/news/343734/

相关文章:

  • PyCharm环境配置全攻略:调试TranslateGemma模型的Python开发环境搭建
  • 成为 aoliao 粉丝的第一天
  • translategemma-4b-it新手教程:不写代码也能用浏览器完成图文翻译任务
  • 深度学习环境配置:Ubuntu系统优化与常用命令大全
  • 世毫九实验室三大核心理论综合研究报告
  • Qwen3-ASR-0.6B语音识别:多语言支持实测分享
  • 如何将电池材料研磨至纳米级,具体方法、注意事项?
  • 灵感画廊开发者案例:基于SDXL 1.0构建跨平台(Web/iOS/Android)艺术APP
  • SiameseUIE中文-base部署避坑指南:常见连接失败与空结果解决方案
  • 使用Cursor开发EasyAnimateV5-7b-zh-InP模型插件
  • java二叉树的简单创建和遍历
  • 24G显存也能玩!BEYOND REALITY Z-Image高效部署方案
  • 2026宿州职业装定制企业评测:谁在引领娱乐行业新风尚? - 2026年企业推荐榜
  • Phi-4-mini-reasoning实测:128K长文本推理能力惊艳展示
  • 2026年音乐留学中介选择:如何识别并选择真正的4E教学体系机构? - 2026年企业推荐榜
  • 本杰明·格雷厄姆的资产负债表分析方法
  • 看不懂 ComfyUI?把它当“生产线”来设计工作流(新手也能上手的版本)
  • 如何识别企业的边缘AI视频分析芯片优势
  • 大数据领域中 RabbitMQ 的安全配置要点
  • 世盟股份深交所上市:市值48亿 预计年营收9亿同比降10%
  • 德业股份冲刺港股:9个月营收88亿 利润23亿 张和君控制60%表决权
  • 基于阿里云v2018数据集的机器负载概率预测:外生特征工程与Python实现
  • eVTOL主机厂沃飞长空完成近10亿融资:光合创投联合投资
  • 摆脱局域网!GoLand+cpolar 解锁 Go 开发远程协作新玩法
  • 多语言 RAG、算法思维、异常值检测与其他问题解决亮点
  • 多层感知器,解释:带有迷你二维数据集的视觉指南
  • 【资讯】CMSIS-DSP库发布V1.7.0版本,ARM发消息Mbed平台将于2026年7月终止服务
  • 没有检索模型构建 RAGs 是一个严重的错误
  • 选品更稳的新打法:用“用户决策阻力”挑品——阻力越大,越有机会做出溢价
  • 计算机毕业设计springboot“聚力”考研互助系统 基于 SpringBoot 的 “研途帮” 考研资源共享平台 基于 SpringBoot 的 “研聚力” 考研信息互助系统