指针和内存管理

一、静态内存分配
    在编译时确定大小,程序运行的适当的时候(函数调用)分配确定大小的空间,用完由OS在函数调用结束时统一释放

优点:无需人工参与,分配效率高
    缺点:内存的浪费,内存使用率低,
                        内存分配只能是按计划分配。

二、动态内存分配
    在程序运行中确定大小,随时申请,随时释放的内存分配

优点:节约内存,内存使用率高,能够做到按需分配
    缺点:需要手动管理(申请和释放),分配效率低,
                        分配时可能会失败,失败时要做异常处理。

动态内存分配的空间在堆中
    作用域:凡是能够找得到该空间的地方
    生命周期:从申请到释放

风险:
    1、忘记释放,会造成【内存泄漏】
    2、过早释放,会造成【提前释放】
    3、多次释放,会造成【重复释放】

分配的大小单位是字节
    申请:malloc
        char *p=(char *)malloc(strlen(s)+1);  
    释放:free

三、全局变量
    定义:定义在函数外面的变量,也叫外部变量
    作用域:所有源文件
    生命周期:整个程序的运行周期

优点:避免复杂的传参,全局都可访问
    缺点:降低内存使用率;
                        全局都可修改,出错不易定位;
                        增强代码的耦合度

建议:尽量少用

练习:
1、仿照strdup实现一个mystrdup
2、仿照strcat实现一个mystrcat

时间: 2024-10-11 04:59:28

指针和内存管理的相关文章

使用内存管理函数实现动态数组

C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间释放,为有效地使用内存资源提供了手段. 动态数组,指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小.其本质就是一个指向数组的指针变量. 主要用到的内存管理函数是:malloc和free. 1.分配内存函数malloc: 调用形式:(类型说明符*)malloc(size): 功     能:在内存的动态存储区中分配一块长度为size字节的连续区域. 返     回:该区域

OC --(9)-- 内存管理初级:内存管理的方式、引用计数机制,影响计数的各个方法、dealloc方法、内存管理的基本原则、掌握copy的实现

iOS应?程序出现Crash(闪退),90%以上的原因是内存问题. 在一个拥有数十个甚?至是上百个类的?程里,查找内存问题极其困难. 了解内存常?问题,能帮我们减少出错几率. 内存问题体现在两个方面:内存溢出.野指针异常. 1.野指针异常 内存管理的方式 引用计数 影响引用计数的方法有 +alloc -retain -copy -release -autorelease

Cocos2d-x内存管理

Cocos2d-x内存管理浅解 1.首先我们知道内存管理分为c++自身管理机制以及Cocos2d-x内存管理机制.在c++中,内存分为堆区.栈区.静态存储区(全局存储区).常量存储区.自由存储区. 主要先说一下堆区和栈区.堆区主要由new和malloc分配,new与delete,malloc与free成对出现,保证内存的分配与回收.堆内存分配地址是逐渐增大的,这一点与栈区相反,我们都知道栈是先进后出,所以栈的存储方向是内存地址逐渐减小的.栈中的内存也是系统自动回收的,这个我们不需要考虑自己管理内

Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十六.内存管理相关知识(二) 1.autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //进行一系列操作 //此处不可以使用

【读书笔记】C#高级编程 第十四章 内存管理和指针

(一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64位更多,这个内存包括可执行代码和加载的DLL,以及程序运行时使用的变量内容). 在处理器的虚拟内存中,有一个区域称为栈.栈存储不是对象成员的值数据类型. 释放变量时,其顺序总是与它们分配内存的顺序相反,这就是栈的工作方式. 程序第一次运行时,栈指针指向为栈保留的内存块末尾.栈实际上是向下填充的,即从

指针和数组及内存管理

1. 指针和地址 TCPL 中给指针的定义是: A pointer is a group of cells (often two or four) that can hold an address . int value = 10; int *pvalue = &value; 上面这个语句的内存模型是: 注意: &(取地址)操作符只对内存中存在的对象起作用,如变量和数组类型.不能对表达式,常量和寄存器变量使用取地址操作. *(析取)操作符应用于一个指针变量时,取得这个指针变量所指向的对象.

内存管理:内存泄漏和空悬指针

********内存管理基础********************* 内存管理:针对的是实例的内存占用的管理(放在堆里面) 实例:1:由class类型构建的实例,2:闭包对象 内存管理技术:ARC:Automatic Reference Count 自动:由语言本身帮我们销毁内存,不需要你手动销毁, 比如在c中就调用dealloc() 引用:let p = Person()  p就是对Person()这个对象的一个引用 计数: let p = Person() //一个 / / let pp

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email&#160;protected]参数 [email&#160;protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

(1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放,造成内存泄露,下面的例子就可能造成20个字节的泄露,内存泄露不是一个立即会引发故障的错误,但是 它将消耗系统内存. void function1() { char *pa; pa = (char*)malloc(sizeof(char)*20); if(NULL !=pa) { strcpy(pa,"hello"); printf("pa = %x\n",