------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----内存管理及内存分区
一、内存管理概念
内存管理是软件运行时对计算机内存资源的分配和使用的技术,其主要目的是如何高效、快速的分配内存资源,并适当的时候回收内存资源。
二、内存分配方式:有三种方式,分别见下面所讲:
(1)从静态存储区分配。内存在程序编译时已分配好,在整个程序运行过程中都存在,例如:全局变量,静态变量。
(2)栈上创建。函数在执行结束后内存会自动释放回收,例如:局部变量,该方式效率高,分配的内存容量有限。
(3)堆上创建。动态分配内存,程序运行时用malloc或new申请任意大小的内存空间,程序员自己负责在何时用free和delete释放内存,该放手使用灵活,但问题也最多。
三、内存分区:分为5个区,详见下面讲解:
(1)bss段:存放未初始化的全局变量和静态变量。
(2)数据段:存放已初始化的全局变量和静态变量。
(3)代码段:存放程序执行代码的一块内存区域。
(4)堆区:存放进程运行中被动态分配的内存区域。
(5)栈区:存放局部变量。
四、常见的内存分配函数
(1)malloc函数:void *malloc(unsigned size);size为内存分配的字节,功能是在堆区分配一块大小为size字节的连续内存空间,若分配成功则返回内存首地址,否则返回NULL。程序示例如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p;
p = malloc(4*sizeof(int));
if(p!=NULL)
{
*p=100;
*(p+1)=1000;
printf("%d,%d\n",*p,*(p+1));
}
else
printf("内存分配失败\n");
return 0;
}
该程序打印输出:100,1000
(2)calloc函数:格式:calloc(块数,长度);程序示例:int *p=(int*)calloc(4,sizeof(int));该语句功能为分配16个字节的内存。注:该函数可自动初始化为0。
(3)relloc函数:格式:relloc(指针变量名,新扩充字节数);程序示例:int *p1=(int*)relloc(p1,10*sizeof(int));该语句功能为在原有的空间上再扩充10个字节内存空间。
五、野指针和内存泄露
(1)野指针定义:指针变量如果不被初始化,则为一个野指针。
(2)内存泄露概念:如果我们分配了一块内存空间,我们就要在函数执行完成后及时释放掉内存空间,否则会造成内存泄露。
(3)程序示例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i=0;
int *p = (int*)malloc(4*sizeof(int));
*p = 1;
*(p+1) = 10;
*(p+2) = 100;
*(p+3) = 1000;
for(i=0;i<4;i++)
printf("%d\t",*(p+i));
free(p); //释放掉内存空间
p=NULL; //若p=NULL不添加,则p就会变为一个野指针
return 0;
}
该函数打印输出:1 10 100 1000,以上该函数使用free(p)以及p=NULL避免了内存泄露。