黑马程序员---IOS基础---内存管理及内存分区

------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避免了内存泄露。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值