[转帖]malloc()与 alloc()区别

malloc,alloc,区别 · 浏览次数 : 0

小编点评

**malloc()函数** * 接受一个数字作为参数,表示要分配的内存空间的大小。 * 返回指向分配内存空间的首地址。 * 如果分配成功,函数将释放内存空间的剩余部分。 * 只能用于分配静态存储区域的内存。 **calloc()函数** * 接受两个数字作为参数,分别表示元素的数目和每个元素的大小。 * 返回指向分配内存空间的首地址。 * 可以在创建数组之前使用,并初始化元素。 * 允许分配混合类型元素的内存。 **主要区别** | 特性 | malloc() | calloc() | |---|---|---| | 参数类型 | 整数 | 整数和数字 | | 允许分配哪些类型 | 静态存储区域 | 静态存储区域和动态存储区域 | | 释放内存方式 | 释放内存空间的剩余部分 | 释放所有内存空间 | | 只能用于分配哪些类型 | 静态存储区域 | 静态存储区域和动态存储区域 | | 返回值 | 指向分配内存空间的首地址 | 指向分配内存空间的首地址 |

正文

https://www.cnblogs.com/longyi1234/archive/2010/03/22/malloc.html

 

malloc()与 alloc()

 
C语言跟内存分配方式
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多

 

C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等.其中alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且没有
初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间. calloc则将初始化这部分的内存,设置为0. 而realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放sbrk则是增加数据段的大小;
malloc/calloc/free基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存.如果程序malloc的大小超出了库里所留存的空间,那么
将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不立即返回给os,而是保留在内部结构中. 可以打个比方: brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求.这套机制类似于缓冲.使用这套机制的原因: 系统调用不能支持任意大小的内存分配(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对于小内存的分配会造成浪费; 系统调用申请内存代价昂贵,涉及到用户态和核心态的转换.
函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。    
    malloc()函数有一个参数,即要分配的内存空间的大小:   
    Void *malloc(size_t size);

 

    calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小:    
    void *calloc(size_t numElements,size_t sizeOfElement);
    如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。
 

    malloc() 函数和calloc ()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是 0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还 没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。

    calloc() 函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。
    malloc() 函数和calloc ()函数的另一点区别是calloc()函数会返回一个由某种对象组成的数组,但malloc()函数只返回一个对象。为了明确是为一个数组分配内存空 间,有些程序员会选用calloc()函数。但是,除了是否初始化所分配的内存空间这一点之外,绝大多数程序员认 为以下两种函数调用方式没有区别:
    calloc(numElements ,sizeOfElement);
    malloc(numElements *sizeOfElement) ;

 

    需要解释的一点是,理论上(按 照ANSIC标准)指针的算术运算只能在一个指定的数组中进行,但是在实践中,即使C编译程序或翻译器遵循这种规定,许多C程序还是冲破了这种限制。因 此,尽管malloc()函数并不能返回一个数组,它所分配的内存空间仍然能供一个数组使用(对realloc()函数来说同样如此,尽管它也不能返回一 个数组)。

 

    总之,当你在calloc()函数和malloc()函数之间作选择时,你只需考虑是否要初始化所分配的内存空间,而不用考虑函数是否能返回一个数组。
    当程序运行过程中malloc了,但是没有free的话,会造成内存泄漏.一部分的内存没有被使用,但是由于没有free,因此系统认为这部分内存还在使用,造成不断的向系统申请内存,是的系统可用内存不断减少.但是,内存泄漏仅仅指程序在运行时,程序退出时,OS将回收所有的资源.因此,适当的重起一下程序,有时候还是有点作用.

与[转帖]malloc()与 alloc()区别 相似的内容:

[转帖]malloc()与 alloc()区别

https://www.cnblogs.com/longyi1234/archive/2010/03/22/malloc.html malloc()与 alloc() C语言跟内存分配方式 (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量

[转帖]MALLOC_ARENA_MAX=1 与 MALLOC_ARENA_MAX=4有什么区别?

https://www.easyice.cn/archives/341 2019年 Elastic开发者大会的时候我曾经说过 glibc 导致的堆外内存过多问题: 如果应用程序每次分配内存的时候都通过系统调用 mmap,sbrk等来分配,效率会很低,所以glibc 中实现了一个内存池,应用程序使用内

[转帖]大页内存的使用:大页内存分配与释放

目录 函数声明 函数原型与使用 函数声明 void *malloc_huge_pages(size_t size);void free_huge_pages(void *ptr); 函数原型与使用 #include #include #include

[转帖]Java原生内存管理(native memory management)(5)-MALLOC_ARENA_MAX

https://zhuanlan.zhihu.com/p/423000502 这篇文章来说说和PhantomReference/finalize无关的东西 - MALLOC_ARENA_MAX. 这个东西只对Linux里的Java有用, 如果你在Linux上有内存耗尽(OOM, out of mem

[转帖]jemalloc内存分配算法

https://www.cnblogs.com/xiaojiesir/p/15450732.html jemalloc内存分配算法简介 jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存分配器。它是一个通用的 malloc 实现,侧重于减少内存碎片和提升高并发

[转帖]文文的复习笔记--底层内存管理

内存分配方式: c++中,内存分成五个区: 堆:new分配执行的内存块,一个new一个delete。 栈:执行函数,局部变量的存储单元在栈上创建,执行结束存储单元自动释放。 自由存储区:由malloc分配的内存块,和堆相似,用free结束自己的生命。 全局/静态存储区:全局变量和静态变量被分配到这一

[转帖]一次操作系统报错OutOfMemory Error的处理记录

在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to a

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、