C/C++动态内存管理

目录

一.C/C++内存分布

二、C语言内存管理方式

三、C++内存管理方式

1.new和delete操作内置类型

2.new和delete操作自定义类型

四、operator new与operator delete函数

1.operator new &&operator delete与malloc&&free的关系

2.异常捕获

 3.stack底层实现new和delete

五、new和delete的实现原理

1.内置类型

2.自定义类型

六、new定位表达式

七、malloc free和new delete的区别

1.共同点

2.不同点

八、内存泄露


一.C/C++内存分布

1. 栈又叫堆栈,存放非静态局部变量/函数参数/返回值等等,栈是向下增长的(高地址-->低地址)

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

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

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

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

二、C语言内存管理方式

malloc开辟的空间不进行初始化

realloc用于扩容:原地扩容和异地扩容

calloc开辟的空间会初始化为0

free用于释放空间

三、C++内存管理方式

C语言内存管理方式在C++中可以继续使用,C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理

1.new和delete操作内置类型

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],注意:匹配起来使用 

2.new和delete操作自定义类型

2.1创建单个类对象

2.2创建多个类对象

 注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会

四、operator new与operator delete函数

1.operator new &&operator delete与malloc&&free的关系

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是 系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过 operator delete全局函数来释放空间

1.用malloc开辟空间,开辟失败会返回NULL,需要我们进行手动检查。而C++提供的new不需要直接检查,开辟错误会抛出异常

operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间 失败,尝试执行空间不足应对措施,如果该应对措施用户设置了,则继续申请,否则抛异常。

2.operator delete: 该函数最终是通过free来释放空间的,free的底层是宏定义:

#define free(p) _free_dbg(p, _NORMAL_BLOCK)

2.捕获异常

 3.stack底层实现new和delete

五、new和delete的实现原理

1.内置类型

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

2.自定义类型

1.new的原理 :

调用operator new函数申请空间

在申请的空间上执行构造函数,完成对象的构造

2.delete的原理:

在空间上执行析构函数,完成对象中资源的清理工作

调用operator delete函数释放对象的空间

3.new T[]的原理:

调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请

在申请的空间上执行N次构造函数

4.delete[]的原理

在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

六、new定位表达式

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

使用格式: new (p) type或者new (place_address) type(list)

p必须是一个指针,list是类型的初始化列表

使用场景: 定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化

七、malloc free和new delete的区别

1.共同点

都从堆上申请空间,需要手动释放

2.不同点

(1)malloc和free是函数,new和delete是操作符

(2)malloc不可以进行初始化,new可以初始化

(3)malloc在开辟空间时需要自己计算所开空间的大小,new后面跟上类型和空间就可以了,开辟N个T类型的对象就是new T[N]

(4)malloc返回的类型是(void*),需要根据所开空间给什么类型的变量使用进行强转,而new不需要,因为new后面直接跟上类型即可

(5)malloc申请空间失败时返回NULL,需要手动添加错误检查判空,new返回失败会抛出异常,不需要判空,但是需要捕获异常

(6)从底层实现原理来看,malloc和free在开辟和释放空间时不会调用构造函数和析构函数,new和delete在开辟空间和释放空间时则会调用构造函数和析构函数

八、内存泄露

一般来说,对于普通程序,内存泄露的影响不大,进程正常结束后会释放资源

对于长期运行的程序,内存泄露的危害就很大了

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值