堆,栈的分配

(1)从静态存储区域分配:

内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。

(2)在栈上分配:

在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配:

即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

一个C、C++程序编译时内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区。

分配器和分配器是用于内存分配的两种不同机制,分别对应内存和内存的管理。 ### 分配分配器用于静态分配内存,其内存分配发生在连续的内存上。在分配内存时,编译器需要知道分配内存的大小。每当函数调用时,其变量都会在分配内存;函数调用结束时,变量分配的内存就会被释放。这个过程在编译器内有预设,通常程序员不需要考虑内存的分配和释放过程。 分配的内存属于临时内存分配,程序完成执行后,该程序使用的所有数据都会在中被刷新。上的数据成员只有在包含它们的方法运行时才能被访问,方法执行完成后,这些数据会被自动分配到其他数据或者取消内存分配。 与分配相比,分配具有以下特点: - **安全性高**:不会出现内存泄漏问题。 - **速度快**:内存分配与销毁都更快。 - **占用内存少**:使用更少的内存空间。 示例代码如下,展示了在分配内存的情况: ```c int main() { // 以下变量是在分配内存 int a; double b; int num[20]; return 0; } ``` ### 分配分配器用于动态内存分配,由程序员在程序运行期间显式指定内存分配与释放。这里的“”是指一可供程序员分配和取消分配的内存空间,与数据结构无关。 堆上分配内存不如分配安全,因为存储在此空间的数据对所有线程都是可以访问的,如果程序员没有处理好这部分内存,程序中会发生内存泄漏问题。如果占满,程序会自动报错。内存没有提供自动解除分配的功能,需要使用垃圾收集器来移除旧的未使用对象,处理速度相对较慢。 示例代码如下,展示了在堆上分配内存的情况: ```c int main() { int *ptr = new int[10]; // 使用完后需要手动释放内存 delete[] ptr; return 0; } ``` ### 二者对比 | 对比项 | 分配器 | 分配器 | | ---- | ---- | ---- | | 基本区别 | 内存在连续块中分配 | 内存无序分配 | | 分配和释放规则 | 编译器自动执行 | 程序员手动操作 | | 成本 | 低 | 高 | | 访问速度 | 快 | 慢 | | 主要问题 | 内存不足 | 内存泄漏 | | 安全性 | 高 | 低 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值