前天面试被问到了这四种内存分配方法的区别,瞬间懵比,半天说不出个所以然,好尴尬。
看来基础还是不扎实,下来赶紧整理整理,恶补一下。
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++ 中动态内存分配方面的知识点。
如果有哪里说的不够准确,或者有遗漏的地方,希望大家不吝指正!