C语⾔中malloc、free和new、delete的⽤法和区别
很多学过C的⼈对malloc都不是很了解,知道使⽤malloc要加头⽂件,知道malloc是分配⼀块连续的内存,知道和free函数是⼀起⽤的。但是但是:
⼀部分⼈还是将:malloc当作系统所提供的或者是C的关键字,事实上:malloc只是C标准库中提供的⼀个普通函数
⽽且很多很多⼈都对malloc的具体实现机制不是很了解。
1,关于malloc以及相关的⼏个函数
#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);
molloc函数也可以这样认为(window下)原型:extern void *malloc(unsigned int num_bytes);
头⽂件:#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
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返回的指针是它分配空间的类型。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。