三、内存管理

1、calloc

表头文件  #include <stdlib.h>

定义函数  void *calloc(size_t nmemb,size_t size);

函数说明  calloc()用来配置nmemb 个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb* size);不过,在利用calloc()配置内存时会将内存内容初始化为0。

返回值      若配置成功则返回一指针,失败则返回NULL。

2、free

表头文件  #include <stdlib.h>

定义函数  void free(void *ptr);

函数说明  参数ptr 为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr 所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。

若参数ptr 为NULL,则free()不会有任何作用。

3、getpagesize

表头文件  #include<unistd.h>

定义函数  size_t getpagesize(void);

函数说明  返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。

返回值      内存分页大小。

4、malloc

表头文件  #include<stdlib.h>

定义函数  void * malloc(size_t size);

函数说明  malloc()用来配置内存空间,其大小由指定的size决定。

返回值      若配置成功则返回一指针,失败则返回NULL。

5、mmap

表头文件  #include <unistd.h>

      #include <sys/mman.h>

定义函数  void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);

函数说明  mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start 指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,

      对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。参数prot 代表映射区域的保护方式,

      有下列组合:
      PROT_EXEC 映射区域可被执行
      PROT_READ 映射区域可被读取
      PROT_WRITE 映射区域可被写入
      PROT_NONE 映射区域不能存取

      参数flags会影响映射区域的各种特性:

      MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。

      MAP_SHARED 对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。     

      MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。

      MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。

      MAP_DENYWRITE 只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。

      MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。

      在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。参数fd为open()返回的文件描述词,代表欲映射到内存的文件。参数offset 为文件映射的偏移量,通常设置为0,代表从文件最前方

开始对应,offset必须是分页大小的整数倍。

返回值      若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno中。

错误代码  EBADF 参数fd不是有效的文件描述词

      EACCES 存取权限有误。如果是MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED 则要有PROT_WRITE 以及该文件要能写入。

      EINVAL 参数start、length或offset有一个不合法。
      EAGAIN 文件被锁住,或是有太多内存被锁住。
      ENOMEM 内存不足。

6、munmap

表头文件  #include<unistd.h>

      #include<sys/mman.h>

定义函数  int munmap(void *start,size_t length);

函数说明  munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述词时不会

      解除映射。

返回值      如果解除映射成功则返回0,否则返回-1,错误原因存于errno中

错误代码  EINVAL 参数start或length不合法。

原文地址:https://www.cnblogs.com/Malphite/p/11403218.html

时间: 2024-11-08 16:04:22

三、内存管理的相关文章

OC-手动内存管理

一.为什么要进行内存管理 ?移动设备的内存极其有限,每个app所能占用的内存是有限制的 ? ?下列行为都会增加一个app的内存占用 ?创建一个OC对象 ?定义一个变量 ?调用一个函数或者方法 ? ?当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量等 ? ?如果app占用内存过大 ?系统可能会强制关闭app,造成闪退现象,影响用户体验 二.OC中的内存管理是管理的内存中的哪一部分: 我们知道:内存分为五大区域:栈区,堆区,数据

OC08 -- 内存管理

一. 内存管理的三种方式 为什么要进行内存的管理呢? iOS程序会出现Crash(闪退)问题,90%以上都是因为内存问题. 内存问题体现在两个方面:内存溢出 .野指针异常. 内存溢出: iOS会给每个应用程序提供一定的内存,用于程序运行.而一旦超出了内存上限,程序就会Crash. 野指针异常: 对象内存空间已经被系统回收, 却仍然使用指针操作这块内存. 一. 垃圾回收(gc):java常见的管理内存的管理内存的方法,由系统自动来检测对象是否被使用,是否被释放. 二. MRC(Manual Ref

分类和内存管理

一.分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法 使用注意: 1)分类只能增加方法,不能增加成员变量 2)分类方法实现中可以访问原来类中声明的成员变量 3)同名方法,分类的优先级最高(方法重构,覆盖原类中方法) 4)方法调用优先级:分类—>原类—>父类(后编译的会覆盖先编译的(.h文件不编译)) 二.SEL: 1)把方法包装成SEL类型的数据 2)根据SEL数据找到对应的方法地址 3)根据方法地址调用对应的方法 4)每个方法都有一个与之对应的SEL类型的对象 例:[p perf

操作系统基本组成--内存管理

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 一·技术简介 内存可以通过许多媒介实现,例如磁带或是 磁盘,或是小阵列容量的微芯片.虚拟内存是内存管理技术的一个极其实用的创新.它是一段程序(由 操作系统调度),持续监控着所有 物理内存中的 代码段. 数据段,并保证他们在运行中的效率以及可靠性,对于每个 用户层(user-level)的进程分配一段 虚拟内存空间. 二·主内存 当一个程序执行, 操作系统将程序的

分布式memcached学习(三)&mdash;&mdash;memcached内存管理机制

  几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab.Slab的大小固定为1MB(1MB=1024KB=1024×1024B=1048576B,1048576字节),一个slab由若干个大小相等的chunk组成. Slab的

垃圾回收GC:.Net自动内存管理 上(三)终结器

垃圾回收GC:.Net自动内存管理 上(三)终结器 垃圾回收GC:.Net自动内存管理 上(一)内存分配 垃圾回收GC:.Net自动内存管理 上(二)内存算法 垃圾回收GC:.Net自动内存管理 上(三)终结器 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 终结器 GC提供了另外一个能

Linux内核分析(三)----初识linux内存管理子系统

Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linux的内存管理子系统,linux的内存管理子系统相当的庞大,所以我们今天只是初识,只要对其进行简单的了解就好了,不会去追究代码,但是在后面我们还会对内存管理子系统进行一次深度的分析. 在分析今天的内容之前,我们先来看出自http://bbs.chinaunix.net/thread-2018659-2-1.html的一位大神做的内存管理图,真心佩服大神.其实这张图可以

内存管理中的三种地址

一.逻辑地址(有时也称虚拟地址) 逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分.例如在C语言指针编程中,可以读取指针变量本身值(&操作)实际上这个值就是逻辑地址,它是相对于当前进程数据段的地址和绝对物理地址无关. 只有在Intel处理器的实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,CPU不进行自动地址转换).逻辑地址也就是在Intel 处理器的保护模式下,程序执行代码段限长内的偏移地址(假定代码段.数据段完全样). CPU启动保护模式后

8、Cocos2dx 3.0游戏开发找小三之3.0版本的内存管理

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十分有限,内存尤为宝贵,开发者必须十分慎重地利用内存,避免不必要的消耗,更要防止内存泄漏. 基于 Cocos2d-iPhone 的 Objective-C风格的内存管理是 Cocos2d-x 的一个特色. 把 Objective-C 的内存管理方式引入 C++,使得游戏开发的内存管理难度下降了个层次.

十天学Linux内核之第三天---内存管理方式

昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内存和内核的可用内存,还会讲到内核对内存分类的方式以及如何决定分配和释放内存,内存管理是应用程序通过软硬件协助来访问内存的一种方式,这里我们主要是介绍操作系统正常运行对内存的管理.插个话题,刚才和姐姐聊天,她快结婚了,说起了自己的初恋,可能是一句很搞笑的话,防火防盗防初恋,,嘎嘎,这个好像是的吧,尽管