malloc函数实现的功能是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了malloc函数实现的功能是啥?相关的知识,希望对你有一定的参考价值。

malloc 原型:extern void *malloc(unsigned int num_bytes); 用法:#include <malloc.h> 或#include<stdlib.h> 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。 malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。 动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。本文简单介绍动态内存分配函数malloc()及几种实现方法。 1. 简介 malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。 2. 函数说明 C语言的动态存储管理由一组标准库函数实现,其原型在标准文件<stdlib.h>里描述,需要用这些功能时应包含这个文件。与动态存储分配有关的函数共有四个,其中就包括存储分配函数malloc()。函数原型是:void *malloc (size_t n);这里的size_t是标准库里定义的一个类型,它是一个无符号整型。这个整型能够满足所有对存储块大小描述的需要,具体相当于哪个整型由具体的C系统确定。malloc的返回值为(void *)类型(这是通用指针的一个重要用途),它分配一片能存放大小为n的数据的存储块,返回对应的指针值;如果不能满足申请(找不到能满足要求的存储块)就返回NULL。在使用时,应该把malloc的返回值转换到特定指针类型,赋给一个指针。 注意,虽然这里的存储块是通过动态分配得到的,但是它的大小也是确定的,同样不允许越界使用。例如上面程序段分配的块里能存n个双精度数据,随后的使用就必须在这个范围内进行。越界使用动态分配的存储块,尤其是越界赋值,可能引起非常严重的后果,通常会破坏程序的运行系统,可能造成本程序或者整个计算机系统垮台。 下例是一个动态分配的例子: #include <stdio.h> #include<stdlib.h> main() int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/ count=100; if((array=(int *)malloc(10*sizeof(int))) == NULL) printf("不能成功分配存储空间。"); exit(1); for(count=0;count<10;count++) /*给数组赋值*/ array[count]=count; for(count=0;count<10;count++) /*打印数组元素*/ printf("%2d",array[count]); 上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array=(int *) malloc (10*sizeof(int)))==NULL)语句可以分为以下几步: 1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针 2)把此整型指针地址赋给array 3)检测返回值是否为NULL 参考技术A 简单说就是从堆中动态分配内存空间 参考技术B malloc()函数用于动态分配内存 参考技术C 原型
extern void *malloc(unsigned int num_bytes);

头文件
#include <stdlib.h>

函数声明
void *malloc(size_t size);
备注:void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型)。

功能
分配长度为num_bytes字节的内存块

返回值
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

说明
关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

名称解释
malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

malloc 和 free 是如何实现的?

【中文标题】malloc 和 free 是如何实现的?【英文标题】:How are malloc and free implemented? 【发布时间】:2011-03-22 10:40:37 【问题描述】:

我想实现自己的动态内存管理系统,以便添加有助于在 C++ 中管理内存的新功能。

我使用 Windows (XP) 和 Linux (Ubuntu)。 实现“malloc”和“free”等功能需要什么? 我认为我必须使用最低级别的系统调用。

对于 Windows,我找到了函数:GetProcessHeap、HeapAlloc、HeapCreate、HeapDestroy 和 HeapFree。

对于 Linux,我没有发现任何用于堆管理的系统调用。在 Linux 上,malloc 和 free 是系统调用,不是吗?

谢谢

编辑: C++ 不提供垃圾收集器,垃圾收集器很慢。有些分配很容易释放,但有些分配需要垃圾收集器。

我想实现这些功能并添加新功能: * 每当调用 free() 时,检查指针是否属于堆。 *帮助垃圾收集。我必须存储一些有关已分配块的信息。 * 使用多个堆(Windows 上的 HeapCreate/HeapDestroy)。我可以快速删除整个堆及其分配的块。

【问题讨论】:

你应该看看 boost 的池分配器:boost.org/doc/libs/1_43_0/libs/pool/doc/index.html 你确定 HeapAlloc 是系统(内核)调用吗?这些很可能在用户端实现,并在进程需要更多内存时触发一些隐藏的私有内核端函数。 Squall - 从措辞上看,这听起来有点像家庭作业问题。是的?没有? 编写内存管理代码非常重要。如果这是家庭作业就好了。但是我认为不值得花时间为你正在编写的任何应用程序编写任何主要的东西,除非你已经非常熟悉操作系统和运行时系统如何与内存交互。即使这样,通常也不值得付出努力,因为 new/malloc 都针对一般情况进行了高度优化,并且在大多数情况下都能很好地工作。除非您对内存使用情况进行了分析,并且有一个非常独特的模式可以为您优化,否则不太可能做得比提供的更好。 How do malloc() and free() work?的可能重复 【参考方案1】:

在 linux 上,malloc 和 free 不是系统调用。 malloc/free 通过使用brk 系统调用以及使用mmap 获得匿名内存来扩展和收缩(如果可以的话)数据段从内核获取内存 - 并且 malloc 管理这些区域内的内存。一些基本信息可以找到很多很好的参考资料here

【讨论】:

其实sbrk不是系统调用,而是库函数。【参考方案2】:

在 *nix 中,malloc() 是在 C 库级别实现的。它使用 brk()/sbrk() 来增长/缩小数据段,并使用 mmap/munmap 来请求/释放内存映射。有关 glibc 和 uClibc 中使用的 malloc 实现的描述,请参阅 this page。

【讨论】:

【参考方案3】:

如果您只是简单地包装系统调用,那么您可能不会在使用标准 malloc 时获得任何收益——这就是他们所做的一切。

更常见的是在程序开始时 malloc(或 HeapAlloc() 等)单个内存块并自己管理分配给它,如果您知道您将要创建/丢弃,这可能会更有效很多小块的内存定期。

【讨论】:

【参考方案4】:

brk是Linux上用来实现mallocfree的系统调用。尝试手册页以获取信息。

你已经把 Windows 的东西搞定了。

在这里看到其他答案,我想指出您可能正在重新发明***;已经有很多好的malloc 实现了。但是编程malloc 是一个很好的思考练习——看看here 一个很好的家庭作业(最初是CMU 代码)实现相同。他们的 shell 比 Linux 操作系统提供的更多,不过 :-)。

【讨论】:

【参考方案5】:

垃圾收集器很慢

这是一个完全没有意义的陈述。在许多实际情况下,程序可以通过使用垃圾收集器获得显着的性能提升,尤其是在多线程场景中。在许多其他情况下,垃圾收集器确实会导致性能损失。

【讨论】:

垃圾收集器如何一般【参考方案6】:

尝试http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html 获取指针。

这是一个简短的性能比较,指向八种不同的 malloc/free 实现。一个很好的起点,因为一些好的参考统计数据将帮助您确定您是否改进了可用的实现。

【讨论】:

以上是关于malloc函数实现的功能是啥?的主要内容,如果未能解决你的问题,请参考以下文章

malloc实现机制缓冲机制文件操作mmap虚拟地址(day06)

malloc 和 free 是如何实现的?

c语言中malloc是啥?怎么用?

C语言中malloc函数的使用方法是啥?

malloc函数详解 C语言逻辑运算符

重写strcpy函数,以实现strcpy的功能