news 2026/3/20 8:39:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初识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++开辟空间的方式!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 8:12:50

vLLM vs Ollama:大模型本地与生产部署如何选型?一文讲透

在大模型工程实践中&#xff0c;vLLM 和 Ollama 是当前最热门的两种推理部署方案。 它们一个主打 高性能生产推理&#xff0c;一个主打 极致易用本地运行。 那么它们分别适合什么场景&#xff1f;如何选型&#xff1f;如何组合使用&#xff1f; 本文将从定位、使用场景、性能对…

作者头像 李华
网站建设 2026/3/14 21:29:54

循环网络RNN--评论内容情感分析

一、构建字表基于微博语料库构建中文字表&#xff0c;通过统计字频筛选有效字符&#xff0c;为每个字符分配唯一索引&#xff0c;并加入未知字符<UNK>和填充字符<PAD>&#xff0c;最终将词表保存为 pickle 文件代码&#xff1a;from tqdm import tqdm import pickl…

作者头像 李华
网站建设 2026/3/16 13:45:15

VMware虚拟机部署Qwen2.5-VL:隔离环境搭建

VMware虚拟机部署Qwen2.5-VL&#xff1a;隔离环境搭建 1. 为什么需要在VMware中部署Qwen2.5-VL 在实际开发和测试过程中&#xff0c;直接在宿主机上安装大型视觉语言模型会带来不少麻烦。系统环境冲突、依赖版本不兼容、GPU资源争抢&#xff0c;这些问题都可能让原本期待的AI…

作者头像 李华
网站建设 2026/3/19 13:25:30

[特殊字符] Nano-Banana效果增强:ControlNet辅助构图提升部件排列规整度

&#x1f34c; Nano-Banana效果增强&#xff1a;ControlNet辅助构图提升部件排列规整度 1. 为什么产品拆解图总显得“乱”&#xff1f;——从视觉逻辑说起 你有没有试过用AI生成一个手机的爆炸图&#xff0c;结果零件像被风吹散一样堆在角落&#xff1f;或者想展示一款咖啡机…

作者头像 李华
网站建设 2026/3/16 9:26:17

SiameseUIE中文信息抽取实战:电商评论情感分析案例

SiameseUIE中文信息抽取实战&#xff1a;电商评论情感分析案例 在电商运营中&#xff0c;每天产生海量用户评论&#xff0c;但人工阅读分析效率极低。你是否也遇到过这样的问题&#xff1a;想快速知道顾客对“屏幕”“续航”“发货速度”这些关键属性的真实评价&#xff0c;却…

作者头像 李华
网站建设 2026/3/16 13:46:25

智能自动化重塑游戏体验:OK-WW鸣潮工具技术解析

智能自动化重塑游戏体验&#xff1a;OK-WW鸣潮工具技术解析 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves OK-WW作为一款…

作者头像 李华