C++内存管理

C++内存分布

在这里插入图片描述

内核空间

操作系统相关的数据和代码,有访问硬件设备的权限,用户不允许读写。

用户空间
栈区 :

和函数调用相关的一些信息,非静态的局部变量,函数的参数返回值,包括一些寄存器信息等

内存映射段 :

共享动态内存库。

堆区 :

动态内存分配,如malloc realloc calloc开辟的空间

数据段 :

全局和静态的数据,如函数内部用static修饰的局部变量,不会随着函数结束被释放,生命周期变长。

代码段 :

不允许被修改的内容,如可执行的代码,只读常量。

C++内存管理

malloc ,realloc ,calloc,free

在C++中依然可以使用C语言中的动态内存管理方式。

new delete new[ ] delete [ ]

new和delete是C++中进行动态内存管理的操作符。

操作内置类型

new可以直接申请一个或多个内置类型大小的空间,不用判空。也可以用该类型的值对申请的空间直接初始化。

	int* p1 = new int;
	delete p1;
	int* p2 = new int(10);
	delete p2;
	int* p3 = new int[10];
	delete[]p3;
	int* p4 = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };
	delete[]p4;

在操作内置类型时候,new所做的工作与malloc类似,通过调用系统提供的operator new函数来申请空间,delete调用operator delete函数来释放空间,而该函数最终也是通过free来释放空间的。

操作自定义类型

使用new给自定义类型的对象开辟空间时,首先调用operator new函数为该对象申请自定义类型大小的空间,然后会调用构造函数对该对象空间的内容进行初始化,N个对象就调用N次构造。
delete,先调用析构函数,释放对象中管理的资源,再调用operator delete函数释放对象本身的空间,有N个对象要释放就调用N次析构函数。

malloc ,free和new,delete总结
  1. 它们都是管理堆上的空间,使用完毕需要手动释放
  2. new和delete是操作符,而malloc和free是函数。
  3. new申请的空间可以初始化,而malloc不行,calloc只能初始化为0.
  4. new申请空间时不需要使用sizeof计算大小,直接跟上类型,而malloc需要计算大小。
  5. 用指针接收开辟的空间的地址时,malloc需要强转,因为它的返回值是void*类型。
  6. 使用new申请空间时不需要判断是否成功,因为operator new函数内部申请失败会抛出异常,而malloc需要判断空间是否申请成功,开辟失败会返回NULL。
  7. 对自定义类型操作时,new和delete会调用构造和析构函数
  8. new在底层的实现是通过operator new函数对malloc方法进行封装,delete在底层通过operator delete对free进行了封装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值