1.malloc()、realloc()、free()函数
这三个函数为c++标准库中的函数,都在#include <stdlib.h>中。
(1)void *malloc()的返回类型为空指针 void *,因为我们并不知道指针指向什么类型的数据,所以用void修饰。
用法:
malloc(size_t),size_t为我们要分配的内存的大小(单位为字节)。
若我们要为一个4个int型数据的数组开辟一块空间,则:int *p=(int *)malloc(4*sizeof(int))
sizeof(int)得到的是一个int型数据占用的字节。用(int *)将void *强制转换成指向int型数据的指针。
p为我们开辟的内存的首地址。开辟的内存在内部(即这4个元素所占的内存空间中)地址在逻辑和物理上都是连续的。
若我们又开辟一块内存空间int *q=(int *)malloc(2*sizeof(int)),q内部是逻辑和物理连续,但q和p所开辟的两块内存之间不一定是连续的。
(2)void *realloc()和malloc()类似,为已存在的内存空间重新开辟一块新的内存
用法:
realloc(首地址,重分配内存大小)
例如,int A[2]={1,2}; 如果我们要向数组中增加一个元素,则需要对数组扩容
int *NewAddress=(int *)realloc(A,sizeof(int)*3);
如果在原有的内存空间M后紧接着存在一块连续的内存空间N满足M+N的大小等于我们所需的内存大小,则NewAddress==A;
若不存在,则会开辟一块新满足我们需求的内存空间,原有的内存空间里的值会按顺序拷贝到新的内存空间中,且原内存空间自动释放,此时,NewAddress!=A
(3)free() 配合malloc()和realloc() ,在不要此内存空间存储的值时,释放掉此块内存。 free(p)
动态分配是在堆中分配内存,需要程序员手动释放
2.new、delete
与malloc()和realloc()和free()不同,new、delete是C++关键字,不是标准库函数。
在使用new时会调用对象的构造函数,使用delete时会调用析构函数。在给非内置类型分配内存的时候,malloc和realloc无法满足动态内存分配(因为要计算所分配的内存大小),因而只能使用new关键字。
假如我们定义了一个类 Dog,为其动态分配内存:
Dog *dog=new Dog[5];
new关键字可以根据数字5自动计算5个Dog类的所需的内存是多少,并为其分配。得到的是一个指针
用完后要记得释放: delete []dog;