前言:在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 释放空间