C++--问题7--new/delete 与 malloc/free

C++--问题7--new/delete 与 malloc/free


1.new 与 malloc的区别

(1)属性:new/delete是关键字,需要编译器支持,效率高于malloc/free,malloc和free是库函数,需要头文件支持。

(2)参数:new申请内存分配时,不需要指定内存块大小,编译器会根据类型信息自行计算,而malloc需要显示指出所需内存大小。

(3)返回类型:new内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需类型转换,故new是类型安全性的操作。而malloc返回的是void*,需要强制转换成我们需要的类型。

(4)重载:C++允许new/delete重载。

(5)自定义类型:new做两件事,先调用operator new函数,申请足够的内存,通常底层用户malloc实现,然后调用类的构造函数,初始化成员变量,返回自定义类型指针。delete是先调用析构函数,然后调用operator delete函数释放内存,底层通常用free实现,malloc和free只能动态申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

(6)new内存分配失败时,会抛出bac_alloc异常,malloc分配内存失败时返回NULL。

(7)内存泄漏对于new和malloc都能检测出来,而new可以指出是哪个文件的哪一行,malloc不可以。

(8)内存区域:new操作符是从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。

2.new和delete是如何实现的

(1)new一个对象时:调用malloc为对象分配内存空间 ,调用对象的构造函数 ;

(2)delete时:调用对象的析构函数,调用free回收内存。

3.既然有了malloc/free,C++中为什么还需要new/delete呢?

(1)malloc/free和new/delete都是用来申请内存和回收内存的 ;

(2)在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free。

4.new/new[]用法

    //开辟单地址空间
    int *p = new int;  //开辟大小为sizeof(int)空间
    int *q = new int(5); //开辟大小为sizeof(int)的空间,并初始化为5。
    //开辟数组空间
    //一维
    int *a = new int[100]{0};//开辟大小为100的整型数组空间,并初始化为0。
    //二维
    int (*a)[6] = new int[5][6];
    //三维
    int (*a)[5][6] = new int[3][5][6];

5.delete/delete[]用法

//释放单个int空间
    int *a = new int;
    delete a;
    //释放int数组空间
    int *b = new int[5];
    delete []b;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值