很多学过C的人对malloc都不是很了解,知道使用malloc要加头文件,知道malloc是分配一块连续的内存,知道和free函数是一起用的。但是但是:

一部分人还是将:malloc当作系统所提供的或者是C的关键字,事实上:malloc只是C标准库中提供的一个普通函数

而且很多很多人都对malloc的具体实现机制不是很了解。

1,关于malloc以及相关的几个函数





1


2


3


4


5


6


7




​#include <stdlib.h>(Linux下)​


 


​void​​ ​​*​​​​malloc​​​​(​​​​size_t​​ ​​size);​


​void​​ ​​free​​​​(​​​​void​​ ​​*ptr);​


​void​​ ​​*​​​​calloc​​​​(​​​​size_t​​ ​​nmemb,​​​​size_t​​ ​​size);​


​void​​ ​​*​​​​realloc​​​​(​​​​void​​ ​​*ptr,​​​​size_t​​ ​​size);​


​也可以这样认为(window下)原型:​​​​extern​​ ​​void​​ ​​*​​​​malloc​​​​(unsigned​​​​int​​ ​​num_bytes);​






1




​头文件:#include <​​​​malloc​​​​.h>或者#include <alloc.h>两者的内容是完全一样的。​



  如果分配成功:则返回指向被分配内存空间的指针

       不然,返回空指针NULL。

       同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。

  malloc分配的内存大小至少为size参数所指定的字节数

  malloc的返回值是一个指针,指向一段可用内存的起始地址

  多次调用malloc所分配的地址不能有重叠部分,除非某次malloc所分配的地址被释放掉

  malloc应该尽快完成内存分配并返回(不能使用NP-hard的内存分配算法malloc和free函数是配对的,如果申请后不释放就是内存泄露;如果无故释放那就是什么都没有做,释放只能释放一次,如果释放两次及两次以上会出现错误(但是释放空指针例外,释放空指针其实也等于什么都没有做,所以,释放多少次都是可以的))

  实现malloc时应同时实现内存大小调整和内存释放函数(realloc和free)


      关于:void *,表示未确定类型的指针。C,C++规定,void *类型可以强转为任何其他类型的的指针。  

    关于void *的其他说法:

         void * p1;

         int *p2;

         p1 = p2;                 就是说其他任意类型都可以直接赋值给它,无需进行强转,但是反过来不可以。

2,malloc和new





1


2


3


4


5


6


7


8


9


10


11


12


13


14




​new​​​​返回指定类型的指针,并且可以自动计算所需要的大小。​


 


​int​​ ​​*p;​


​p =​​​​new​​ ​​int​​​​;  ​​​​//返回类型为int *类型,分配的大小为sizeof(int)​


​p =​​​​new​​ ​​int​​​​[100];   ​​​​//返回类型为int *类型,分配的大小为sizeof(int) * 100​


​而​​​​malloc​​​​则必须由我们计算字节数,并且在返回的时候强转成实际指定类型的指针。​


​int​​ ​​*p;​


​p = (​​​​int​​ ​​*)​​​​malloc​​​​(​​​​sizeof​​​​(​​​​int​​​​));​


​1,​​​​malloc​​​​的返回是​​​​void​​ ​​*,如果我们写成了: p =​​​​malloc​​​​(​​​​sizeof​​​​(​​​​int​​​​));间接的说明了(将​​​​void​​ ​​*转化给了​​​​int​​ ​​*,这不合理)​


​2,​​​​malloc​​​​的实参是​​​​sizeof​​​​(​​​​int​​​​),用于指明一个整形数据需要的大小,如果我们写成:​


​p =  (​​​​int​​ ​​*)​​​​malloc​​​​(1),          那么可以看出:只是申请了一个字节的空间,如果向里面存放了一个整数的话,​


​将会占用额外的3个字节,可能会改变原有内存空间中的数据​


​3,​​​​malloc​​​​只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我​


​们习惯性的将其初始化为NULL。 当然,也可以用​​​​memset​​​​函数的。​



简单的说:

malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的,而在物理上可以不连续。我们作为程序员,关注的 是逻辑上的连续,其它的,操作系统会帮着我们处理的。

3、malloc,free和new,delete的区别

(1)malloc和new都是在堆上分配内存。栈区的内存分配是系统自动分配释放的,主要存放函数的参数值、局部变量的值等。

(2)Malloc和free在C程序中使用,而C++程序中使用new和delete,删除数组delete[]p,指针释放后,要将指针置空。

(3)New和delete可以调用构造函数和析构函数。

(4)Malloc是函数,new是关键字。

(5)Malloc不能赋初值,new可以,如int *p = new int(2).代表分配一个int型的内存空间,并赋初值2.如果new int ()代表赋初值0,new int[10]代表分配10个int.

(6)Malloc返回的指针是void *类型,而new返回的指针是它分配空间的类型。