malloc函数
说明:在堆区分配一块指定大小(size)的空间,用来存放数据。这块内存空间在函数执行完之后不会初始化,值是未知的。
返回值:分配成功则会返回指向该内存的地址,失败则返回null。
void *malloc(size_t size);
eg: int *p = (int *)malloc(sizeof(int)*10);
在每次使用完malloc函数之后,都要调用free进行释放空间,不然会占用内存。
calloc函数
说明:在堆区分配一块连续内存块。num表示内存块数量,size表示每个内存块的大小,并将每个内存块初始值设为0。
返回值:分配成功则会返回指向该内存的地址,失败则返回null。
void *calloc(size_t num, size_t size);
eg:int *p = (int *)calloc(10, sizeof(int));
在每次使用完calloc函数之后,都要调用free进行释放空间,不然会占用内存。
malloc和calloc函数区别
- malloc(size_t size)这里size的大小需要我们去计算。
- calloc(size_t num, size_t size) num是我们申请内存块个数,size为内存块长度,具体不需要我们去计算。
- malloc申请的空间没有初始化。calloc申请的空间统一初始化为0.
- calloc要给每一个内存空间都初始化,所以效率比malloc函数低。
realloc函数
说明:改变ptr指向size个字节的内存块大小
返回:如果修改失败则返回null,原来的内存不会变。如果原来的内存后面剩余内存还多,realloc后的内存为原来的内存+剩余的内存,返回原来内存的地址。如果原来内存后面剩余内存不够的话,realloc则会申请新的内存,把原来内存数据拷贝到新内存里,原来的内存被free,返回的是新内存地址。
void *realloc(void *ptr, size_t size);
注意:
- 当size等于0,ptr不等于控制,realloc函数相当于free。
- 当ptr为空时,realloc函数相当于malloc函数。
- 传递给realloc函数的ptr必须是经过malloc(), calloc()分配过内存的。
new函数
说明:C++中申请内存函数,对应的需要delete()函数来释放内存。
data *d = new data;
delete d;
int *a = new a[10];
delete[] a;
原理:
new:调用operator new申请空间,在申请空间执行构造函数,完成对象的构造。
delete:在空间执行析构函数,完成对象中资源的清理工作。调用operator delete函数来释放空间。
new []:调用operator new[],在operator new[]函数中调用operator new函数完成N个对象空间的申请。在申请的空间上完成调用N次构造函数。
delete[]:在释放的对象空间上调用N次析构函数,完成N个对象空间的资源清理。在调用operator delete[],在Operator delete[]中调用operator delete释放空间。
注意:
- new/delete申请和释放的单个元素的空间
- new[]/delete[]申请和释放的是连续空间
- new在申请空间异常时会抛异常。
- 使用new时无需计算内存大小,返回类型不需要强转,直接返回安全类型
malloc/free与new/delete的区别
- malloc和free为函数,new和delete为操作符。
- malloc申请空间需要手动计算大小,new只需要在后面跟上空间类型就可以了。
- malloc返回类型为void *使用时必须强转。new不需要。
- malloc分配失败是返回null,因此必须判空。new分配失败会直接抛错,所以需要捕获异常。
- malloc和free只会申请和释放空间,不会调用构造函数和析构函数。new会在申请空间后调用析构函数对对象进行初始化,delete会在释放空间之前调用析构函数对空间资源进行清理。
- malloc在申请空间不够用时可以调用realloc进行增加,new不可以。
2087



被折叠的 条评论
为什么被折叠?



