因为直接学了C++,所以对C的一些细节了解不是很清楚,于是在这里补充一点小知识——动态内存分配,C++中相关的是new和delete,而C中相关的是malloc、calloc、realloc和free。
注:alloc代表allocate,意为“分配”。
这是腾讯面试时被问了2次的问题,当时我回答了,delete p一般用来删除给单个元素分配的内存,而delete []p是用来删除数组的内存分配。
而面试官继续问,“这两个可以互换使用吗?”
然后我就不会了,第一次被问后忘记去查,所以第二次自然也杯具了。
在多数编译器中两种表达式等价,使用没有区别,操作符重载不同而已。不过,那是编译器人家自己优化得好,所以真正的区别是……
- 对于基本数据类型(单个或数组),delete p和delete []p无区别。
- 对于自定义的类
- 单个:只能delete p,delete []p会出错(比如,死循环……)
- 数组:delete []p绝对是对的,而delete p相当于delete p[0],只释放了第一个元素的内存(见下例)
#include <iostream> using namespace std; class S { public: S(){cout << "Constructor" << endl;} ~S(){cout << "deconstructor" << endl;} }; int main() { S *s1 = new S[2]; delete s1; S *s2 = new S[2]; delete []s2; }
运行结果:
Constructor
Constructor
deconstructor
Constructor
Constructor
deconstructor
deconstructor
原型:
void * malloc (size_t nbytes);
用法:
int* p = (int*)malloc(5*sizeof(int));
注意:malloc返回的是空指针,所以使用时需要进行转换,详见空指针与函数指针。
原型:
void * calloc (size_t nelements, size_t size);
用法:
int *p = (int *) calloc (5, sizeof(int));
注意:malloc和calloc除了参数不同之外,还有一点不同就是calloc 会将所有元素初始化为0。
原型:
void * realloc (void * pointer, size_t size);
用法:
int *q = realloc(p, 5*sizeof(int));
注意:第一个参数p是一个已经被分配内存的指针或空指针,第二个参数是总的字节数。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要求。内存分配成功后,该函数将p指向的内容完整的复制到新的内存中并返回新的地址;若内存分配失败,则返回NULL指针,p和p指向的内容不变。
原型:
void free (void * pointer);
用法:
free(p);
注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。