一.内存分布
进程地址空间:Linux证明
代码源文件在磁盘上,运行后,变成一条条指令,由main函数被识别,开始放到各自的数据段。
栈区和堆区涉及到动态内存管理,栈区向下增长,堆区向上增长。
二.C和C++的动态内存管理
C中,动态内存管理用到malloc、realloc、calloc、free
需要留意malloc、calloc、realloc的区别:
C++,引用new、delete,new跟malloc的功能类似。
在C++,由于引入了构造函数,析构函数等,对于内置类型,调用默认构造函数时,对内置类型不处理,对自定义类型,调用它的默认构造函数,new能自动调用默认构造函数;析构函数不需要对内置类型处理,要处理的是自定义类型,delete能自动调用析构函数。
C++引用new和delete有一定的使用规范:
malloc失败会检查,new失败会抛异常。
operator new和operator delete可以重载,写好了优先调用你写的。
定位new:
定位new常常配合内存池使用,因为内存池是提前开好空间,但是没有初始化,也就是说,空间没有执行默认构造函数。
三malloc和new的区别
malloc只开空间,new开空间和初始化。对于内置类型,没有大的区别,new主要应对的是自定义类型,自动调用默认构造函数。malloc失败返回NULL,new是抛异常。new可以一次开多个对象,new是c++引入的关键字,而malloc是一个函数。
四free和delete的区别
delete针对自定义类型,自动调用析构函数,底层delete是用free实现的,delete要根据new是否带[]开多个空间,匹配上。delete是一个关键字,free是一个函数。