c++内存分配详解

来源:互联网 发布:mysql登录指定数据库 编辑:程序博客网 时间:2024/05/16 19:14

一、c/c++内存分配的5个区分别是:

栈区、堆区、全局区(静态区)、文字常量区、程序代码区

1、栈区:编辑器自动分配 和 释放,存放函数的参数,局部变量等。 

2、堆区:一般是程序员分配和释放,如果在程序一直运行的状态下,程序员不去释放内存,会导致内存泄漏之后会打到一定程度的时候会导致系统崩溃。   或者如果程序员没有释放内存但进程结束时,内存的回收是由os来回收的 

3、全局区(静态区):全局变量和静态变量 在不初始化的情况下默认的是0,存放在一块区域。   如果是初始化的话是存放在相邻的另一块区域。 程序结束时是由系统来释放内存的。

4、文字常量区:所有的字符串都存放在文字常量区。   当程序结束时由系统释放。

5、程序代码区:程序员写的所有代码都是存放在代码区的。

二、堆和栈的区别

内存的管理方式: 

栈:是由编辑器自动管理,声明变量时分配空间,变量结束使用时释放空间。
堆:是由程序员负责分配和释放的,  对于c用malloc来分配内存,用free释放内存。 对于c++用new来分配内存,用delete释放内存。 但对于堆容易造成内存泄漏

空间的大小不同:

栈:在windows下,栈是向低地址扩展扩展的数据结构,是一块连续的内存区域。就是说栈顶的地址事先规定好,一般情况下windows下栈的大小是2M。当申请的空间超过栈的剩余空间时,将提示overflow。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。系统是用链表存储空闲的内存地址。堆的大小受限与计算机系统中有效的虚拟内存,因此堆获得的空间比较灵活,也是比较大的。

内存的分配方式:

栈:栈是先进后出的队列,他的分配和释放是由编辑器来操作的。  因此对于内存泄漏这个问题是不会出现的

堆:堆是由程序员分配和释放内存的。但往往很多程序员都是分配内存之后忘了释放内存。 所以这样很容易导致内存泄漏

分配速率:

栈:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

堆:堆为了分配一块内存,库函数会按照某种算法在堆内存寻找可用的足够大小的空间,如果没有足够大小的空间,就有可能调用系统功能去增加程序数据段的内存空间,这样就会分到足够大小的内存,然后进行返回。这种分配方式的效率比较慢。


三、程序例子

#include <iostream>#include <stdio.h>int a;// 默认初始化为0,全局未初始化区int b = 3;// 全局初始化区int c = 4;// 全局初始化区int main(){/*这里可以证明 ,   a没有初始化默认是0   在全局为初始化区   而b,c 都在全局初始化区。  所以b,c的内存地址是连续的,而a的内存和b,c是不连续的*/std::cout << &a << std::endl << &b << std::endl << &c << std::endl;char* p;// 在栈里面p = (char*)malloc (10);// 此时指针p指向的堆内存的地址static int c = 0;// 静态初始化区getchar();return 0;}



0 0