【编程语言】关于 malloc,calloc,realloc,new 进行动态内存分配的区别

前天面试被问到了这四种内存分配方法的区别,瞬间懵比,半天说不出个所以然,好尴尬。

看来基础还是不扎实,下来赶紧整理整理,恶补一下。

malloc 函数:void *malloc(unsigned int size)

在内存的动态分配区域申请一块长度为 size 的连续空间。如果申请成功,则返回分配空间的首地址,如果不成功,则返 NULL。

申请的内存不会初始化,里面的值是随机的不可预知的。

 

calloc 函数:void *calloc(unsigned int num, unsigned int size)

在内存的动态分配区域申请 num 块长度为 size 的连续空间,也就是长度为 num * size 的连续空间。如果申请成功,则返回分配区域的首地址,如果不成功,则返回NULL。

申请到内存空间之后,会自动初始化为 0。

 

realloc 函数:void* realloc(void* ptr, unsigned newsize)

给已经分配了地址的指针 ptr 重新分配空间, 动态分配一个长度为 newsize 的连续内存空间。

申请的内存空间不会初始化。

 

new :动态内存分配的运算符

 在动态内存分配时可以自动计算所需要的大小。如果申请成功,会返回指定类型的指针,若不成功,则返回NULL或抛出异常。

 关于初始化,在动态分配类类型时,会调用类的构造函数,对内存空间进行初始化;在动态分配内置类型时,是否初始化取决于后面有没有括号()。

int *p1 = new int[10];    //仅分配内存空间,不初始化
int *p2 = new int[10]();  //分配内存空间,并初始化为 0

malloc 和 calloc 的区别

malloc 仅分配内存空间,而不能对内存空间进行初始化。malloc() 函数分配的内存空间,可能是已经被分配使用过的,里面可能残存着各种各样的遗留数据(使用之前需要手动进行初始化)。

而 calloc 在分配内存空间之后,会自动初始化内存空间。如果是为 int 或 char 类型的元素分配内存,则会将这些元素初始化为 0;如果是指针类型的元素,则会初始化为空指针;如果是实型数据(浮点型),则会初始化为浮点型的 0。

malloc 和 new 的区别

主要有三个方面的区别,内存空间大小,初始化,和返回值。

1. 在动态申请内存空间时,使用 new 可以自动计算需要的空间大小,而使用 malloc 需要自己指定申请的空间大小(如果申请的空间大小不合适,可能会造成数据丢失)。

// 自动分配 100 * sizeof(int) 的内存空间
int *p1 = new int [100]; 

// 需要手动指定申请空间大小为 sizeof(int) * 100
int *p2 = (int *) malloc (sizeof(int)*100);

2. malloc 申请内存空间时,不会初始化;new 申请内存空间时,自定义类型的元素,会调用构造函数进行初始化,内置类型的元素,如果加(),则显式调用它的构造函数进行初始化,如果不加(),则仅仅分配内存,不初始化。

3. 使用 malloc 分配内存之后,返回的式 void* 指针,需要显式地强制转换成对应类型的指针,否则会报错。使用 new 分配内存之后,返回指定类型的指针。

// new 分配内存空间之后,返回 int* 类型的指针
int *p1 = new int [100]; 

// 会报错:“不能将 void* 赋值给 int * 类型变量”
int *p2 = malloc (sizeof(int)*100);

//需要显式地对 malloc 返回值进行强制转换
int *p2 = (int *) malloc (sizeof(int)*100);

 

自己总结整理的一些关于 C/C++ 中动态内存分配方面的知识点。

如果有哪里说的不够准确,或者有遗漏的地方,希望大家不吝指正!

发布了53 篇原创文章 · 获赞 144 · 访问量 28万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章