C++内存管理及new /malloc,free/delete 区别

前言:在C++中首先要了解的是它的内存分布,在操作系统中,它叫程序地址空间(虚拟地址空间)。

这里的地址空间并不是真正的物理地址空间,而是虚拟的,原因很简单:第一点:操作系统为了保护资源,不能给你真正的地址,防止你破坏。第二点:高效性,给你4G的内存(32位下),并不一定全给你分配,只是给你映射需要的一部分。这样多个程序跑起来的就会非常快。

下面,具体说下分布:

                                                                    内核(1G左右,给操作系统用的)

                                                                    栈(占的空间不是很多,函数,局部变量,等存放位置)

                                                                   内存映射段(文件映射,动态库,匿名映射)

                                                                    堆(大约占1/2空间,用于程序运行时动态分配)

                                                                   数据区(存放的是全局数据,静态数据)

                                                                   代码区(可执行代码,和只读常量)

说明:地址是从底向上增长的,在32位下,是0- 2^32-1 。其中堆是向上生长的,而栈是向下生长的。

C++管理内存方式

C语言的内存管理方式是malloc/calloc/realloc/free ,但是在C++中这种方式可以用但是有些地方用起来特别麻烦,所以就提出了自己的管理方式,new/delete。

1.new/delete操作内置类型

在C语言中,malloc/free是函数,而new/delete是操作符,它们是内置类型

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free是不会调用的。

2.operator new 和operator delete

delete/ new在底层是调用了全局函数 operator new,operator delete来申请空间和释放空间的。

而operator new 和 operator delete 其实底层又调了 malloc和delete的,只是它们的区别是多了抛异常的。

 

总结: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 释放空间

          

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值