C/C++内存模型及动态内存管理

C/C++内存模型:

内存模型有五个区,由高地址到低地址依次:

​ 栈——堆——全局/静态存储区——常量存储区——自由存储区

栈:

​ 1.栈的存储是连续的且被一一记录的。

​ 2.内存由编译器在需要时自动分配和释放。

​ 3.通常存储为局部变量和函数参数。

​ 4.栈运算分配内置于处理器指令集中,效率很高,但内存有限。

​ 5.函数体执行结束时这些内存被自动释放。

堆:

​ 1.堆内申请的东西是随机分配的。

​ 2.使用malloc进行分配,free释放。如果没有对内存进行正确的释放,会造成内存泄漏,进而引发内存溢出。

​ 3.申请堆空间后,需用一个指针保存堆空间地址,便于查找,预防泄露。

​ 4.堆是一个操作系统术语,是操作系统维护的一块动态分配内存

全局/静态存储区:

​ 1.全局变量,静态变量被分配到同一块内存中。

​ 2. c中区分初始化和未初始化,c++不再区分。

常量存储区:

​ 1.存储常量,不能被修改。(特殊手段也能修改 如指针)

自由存储区:

​ 1. 由new申请的空间,使用delete释放。(和堆类似)

​ 2. 自由存储区是c++通过new、delete 动态分配和释放对象的抽象概念。

​ 3.由堆实现的自由存储,可以说是在堆上。(但并非等价)

动态内存管理:

new / delete:
  1. 是c++ 的的运算符,用于申请/释放动态内存。
  2. new 建立的是一个对象,空间大小与对象相。
  3. new 出来的附带类型信息,new 不出来抛出异常。
malloc / free :

​ 1.是c/c++的标准库函数 ,用于申请 / 释放动态内存。

​ 2.无法满足非内部动态对象的要求。(由于其是库函数,不在编译器控制权限内,无法执行对象的构造、析构函数)

​ 3. malloc分配的是一块内存,大小用户决定。

​ 4. malloc 分配返回(void*) 指针需要强制转化为所需指针,malloc不出来返回null。(需要判断是否申请成功)

你可能感兴趣的:(c++,c++)