IOS内存分配状态

内存分区:可以分为5个区

说到内存分区,内存即指的是RAM。
栈区(stack): 这个一般由编译器操作,或者说是系统管理,会存一些局部变量,函数跳转跳转时现场保护(寄存器值保存于恢复),这些系统都会帮我们自动实现,无需我们干预。 所以大量的局部变量,深递归,函数循环调用都可能耗尽栈内存而造成程序崩溃 。
堆区(heap): 一般由程序员管理,比如alloc申请内存,free释放内存。我们创建的对象也都放在这里。
全局区(静态区 static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。注意:在嵌入式系统中全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。举例:int a;未初始化的。int a = 10;已初始化的。
常量区:常量字符串就是放在这里的,还有const常量。
代码区:存放代码,app程序会拷贝到这里,程序不是在ROM里面存储吗?看下面的举例

当一个app启动后,代码区,常量区,全局区地址已固定,因此指向这些区的指针不会为空而产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(编程中很常见)。

demo

int a = 0; //全局初始化区
char *p1; //全局未初始化区

void main()  {
int b; //栈
char s[] = "abc"; //栈
char *p2;  //栈
char *p3 = "123456";   / /123456{post.content}在常量区,p3在栈上
static int c = 0;  //全局(静态)初始化区


p1 = (char *)malloc(10);  //分配得来得10字节的区域在堆区
p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区


strcpy(p1, "123456");   //123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块

}
int main(int argc, const char * argv[]) {
    // 局部变量是保存在栈区的
    // 栈区变量出了作用域之后,就会被销毁
    NSInteger i = 10;
    NSLog(@"%zd", i);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容