C/C++内存管理

C/C++内存分布

  1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。

  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。。

  3. 堆用于程序运行时动态内存分配,堆是可以上增长的。

  4. 数据段--存储全局数据和静态数据。

  5. 代码段--可执行的代码/只读常量。

C语言中动态内存管理方式:malloc/calloc/realloc/free。

C++内存管理方式

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

new/delete操作内置类型

cpp 复制代码
void Test()
{

int* p1 = new int;// 动态申请一个int类型的空间

int* p2 = new int[10];// 动态申请10个int类型的空间

//简化了C语言malloc的使用,不需要强转类型跟sizeof。
delete p1;//new出来的用delete
delete []p2;//new[]出来的用delete[]

//申请对象+初始化
int* p3=new int(0);//单个对象初始化成0;
int* p4=new int[10]{0};//10个对象都初始化成0
int* p5=new int[10]{1,2,3,4,5}//前5个初始化,后面5个全初始化成0

delete p3;
delete[] p4;
delete[] p5;

}

上面是new对于内置类型的使用,下面举例对于自定义类型的使用:

对于自定义类型:类,new对象会自动调用对应的构造函数,delete会自动调用对应的析构函数。

还能这样用:

上图p3用3个已经存在的对象对另一个对象的初始化,调用了拷贝构造。

C++兼容malloc跟free的用法,但是它们不会调用构造函数跟析构函数。

以后C++动态申请内存都用new。

关于new申请失败的情况:

平时我们写的一些小练习申请的内存小,基本不用考虑new失败的情况。

如果大量申请内存,或者小块内存大量使用的情况就要注意。

在可能new失败的地方用try catch包裹起来捕获报错原因(后续学习会有介绍)。

代码示例:

会弹出报错原因:没有足够内存供你使用。

关于new跟delete的一些底层:

对于一些不涉及析构的时候,底层还是malloc和free。

new跟delete一定要匹配使用。

相关推荐
优橙教育1 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
我叫洋洋2 小时前
C ++ [ hello world ]
c语言·c++·算法
SeaTunnel3 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影3 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
天空'之城3 小时前
C 语言工业级通用组件手写 09:CRC32 数据校验
c语言·嵌入式开发·数据校验·crc32·工业级组件
Marst Code4 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121314 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城5 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience7 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao7 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具