C++中的malloc函数

malloc => memory allocation, 中文名为 动态内存分配。 具体我们来解释一下:

这个函数的原型为  extern void *malloc(unsigned int num_bytes);  分配长度为 num_bytes字节的内存块

返回值:  如果内存分配成功会返回一个void类型的指针 void*  => void*表示未确定类型的指针,C,C++规定, void*类型可以强制转换为其他任何类型的指针。 当malloc分配的内存不再使用时,应该使用free()函数将内存释放

这个函数,它会在内存的动态存储区中分配一个长度为size的连续空间, 它返回一个指针 *void, 这个指针指向该分配域的起始地址(如果分配成功)。 如果分配不成功,则返回空指针NULL

malloc函数的工作原理:
它会将一个一个可用的内存块连接为一个长长的列表,形成空闲链表。调用malloc函数时,它在这个列表中寻找,找出一块大小足以满足需求的内存块。然后,在这个内存块中,切出一块和用户要求大小一样的内存块,剩下的另一块返回到列表上。调用free函数时,会释放内存块,并且把释放的内存卡连接到空闲链表上。慢慢地,空闲链表会被切成很多的小内存片段,这个时候,如果用户申请一个比较大的内存空间,可能就会出现空闲链表上没有满足用户要求的片段了。=》 这个时候,会发生什么呢? 这个时候,malloc函数请求会延时,并会开始在空闲链上翻箱倒柜地检查各个内存片段,对它们进行整理,将相邻的小空闲块合并为较大的内存块。 =》 如果还是没有办法获得所需要的内存块,malloc函数就会返回NULL指针。

所以,从上可以看出,malloc分配的内存空间在逻辑上是连续的,但在物理上可能连续也可能不连续(通过链表来把这些不连续的内存块链接起来)。

malloc和new的区别:

 new => 是C++里面的关键字,它本身不是一个函数。 C++编译器会把new编译成目标代码. new会返回指定类型的指针,并且会自动计算所需要的大小。

malloc => malloc是函数,要使用malloc函数,必须在代码中包括头文件stdlib.h, malloc不像new,会自动计算所需要的内存大小,它需要我们程序员来计算所需要的内存大小-字节数,并且返回的是void类型的指针*void,需要我们程序员来把它强行转换为实际类型的指针.

 另外一点就是,malloc函数只是负责分配内存,但它不能对所分配的内存进行初始化,所以在得到的这片新内存中,值完全是随机的。 而new是可以对分配的内存进行初始化的

posted on 2024-02-06 16:51  新西兰程序员  阅读(84)  评论(0编辑  收藏  举报