malloc/free 与new/delete 使用区别

malloc/free 与new/delete 区别总结

参考了一些博主的,作总结如下:
原文链接:https://blog.csdn.net/cherrydreamsover/article/details/81022039

1、 malloc/free 是c/c++ 标准库函数 new/delete 是c++操作符
2、 申请内存位置不同
new操作符 在自由存储区上为动态分配内存空间的, malloc从堆上动态分配内存。
自由存储区是C++基于new操作符

C++内存布局:内存区分为5个区,栈、堆、自由存储区、全局/静态存储区、常量区

3、返回值类型不同
new分配成功时,返回的是对象类型的指针,而malloc返回void*,需要通过强制转换才能转成我们需要的类型

4、定制内存大小不同
malloc/free手动计算大小,而new、delete编译器自动计算

5、 内存分配失败时,new抛出bad_alloc异常,不会返回NULL。而malloc分配内存失败返回null

6、
malloc/free只是动态分配、释放内存空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理成员。重要!!!!


c++ primer plus中的一个例子

#include <iostream>
#include <string>

using namespace std;
char* getname(void);

int main(void)
{
    char*  name;
    name =getname();
    cout<< "The length of "<<name <<" is"<<strlen(name)<<endl;
    delete [] name;
    name =getname();
    cout<<"The length of" <<name<< "  is"<<strlen(name)<<endl;
    delete [] name;
     system("pause");
}
char* getname()
{
     char tmp[80];
     cout<<"Enter last name:";
     cin>>tmp;
     char *pn=new char[strlen(tmp)+1];//用strlen计算分配所需大小的内存
     strcpy(pn,tmp);//把输入的放到pn指针指向的内存中去
     return pn;
 }

对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。

具体调用是,new分配内存时,先调用malloc后调用构造函数,释放空间时,先调用析构函数,后调用free。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值