SourceURL:file://文字文稿1

在C/C++里,内存管理是通过专门的函数来实现。

malloc 、calloc、new 都是用来在 堆区 分配内存的,根据语言可以分类两类:

C :malloc 、calloc

C++ :new

malloc 和 calloc 主要区别:

1、malloc 只申请内存,不初始化,可以用于任何类型的分配

     2、calloc申请内存并初始化所有位为0,主要用于数组类型的分配

3、malloc 执行效率要高于 calloc

new 是 c++ 中用来在 堆区 分配内存的,它跟 malloc 一样 不会初始化所有位 且执行效率几乎一致,但是,它会调用对应数据类型的构造函数。

其次,使用 malloc 、calloc、new 分配的内存,都可以使用 delete 来释放,如果要遵循 C 写法,请使用 free 函数。

tips: 不要使用 free 函数去释放由 new 分配的内存,具体的看 《C++ 中 free 与 delete 的区别》free 不管你的指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete/delete [] 要方便。不过,必须注意,如果你在分配指针时,用的是new或new[],那么抱歉,当你在释放内存时,你并不能图方便而使用free来释放。反过来,你用malloc 分配的内存,也不能用delete/delete[] 来释放。

一句话,new/delete、new[]/delete[]、malloc/free 三对均需配套使用!

在 malloc 、 calloc 以及 new 之间如何选择?

遵循 C++ 写法时,应优先使用 new 分配所有类型

遵循 C 写法时,可以参考以下方案:

分配 string 类型选 calloc分配非 string 类型选 malloc

分配内存 malloc 函数:
C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的void *指针。
下面是 malloc() 函数的声明。void *malloc(size_t size)
参数
    • size -- 内存块的大小,以字节为单位。 
返回值
该函数返回一个void *指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。

例如:
int* p = (int *)  malloc (sizeof(int));

如果想分配100个int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 );

手动申请的内存空间需要进行手动释放,对于malloc申请的内存空间需要使用free()函数来释放

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

free(p);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。值得注意的是malloc申请的内存空间不会被初始化,需要手动调用memset()函数进行初始化。

分配内存 new 函数:
从函数声明上可以看出。new 返回指定类型的指针,并且可以自动计算所需要大小。比如:
int *p = new int; //返回类型为int* 类型(整数型指针),分配大为 sizeof(int);
或: 
int* parr = new int [100];  //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
同样的,调用new()函数申请的内存空间,需要进行手动释放,与malloc不同的是,new()申请的空间,需要使用delete运算符进行内存释放。

new运算符通常搭配delete元素安抚来使用,new用来动态申请存储空间,delete用于释放new申请的空间。

例:

int *p = new int;

delete p;

int* parr = new int [100];

delete[] arr;//注意要删除数组时,需要加[],以表示arr为数组。

分配内存 calloc 函数:
C 库函数 void *calloc(size_t nitems, size_t size) 分配所需的内存空间,并返回一个指向它的指针。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。

声明,面是 calloc() 函数的声明。

void *calloc(size_t nitems, size_t size)

参数

nitems -- 要被分配的元素个数。

size -- 元素的大小。

返回值

该函数返回一个void *指针,指向已分配的内存。如果请求失败,则返回 NULL。

手动申请的内存空间需要进行手动释放,对于malloc申请的内存空间需要使用free()函数来释放

例:

int* p = (int *) calloc ( sizeof(int) * 100 );

free(p);