栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

malloc,calloc,realloc,new使用以及区别

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

malloc,calloc,realloc,new使用以及区别

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不可以。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026955.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号