• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 有了malloc/free,为什么还要new/delete?

有了malloc/free,为什么还要new/delete?

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了malloc delete,malloc free,c malloc free,malloc和free函数,malloc后要free等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

有了malloc/free,为什么还要new/delete?


malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用malloc/free无法满足动态创建对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
下面一起来看一下malloc/free和new/delete如何实现对象的动态内存管理,代码如下:
class Obj
{
public:
Obj(void)
{
cout<<"Initialization";
}
~Obj(void)
{
cout<<"Destroy";
}
void Initialize(void)
{
cout<<"Initialization";
}
void Destroy(void)
{
cout<<"Destroy";
}
};
void UseMallocFree(void)
{
Obj *a = (Obj *)malloc(sizeof(Obj));//申请动态内存
a->Initialize();//初始化
//...
a->Destroy();//清除工作
free(a);//释放内存
}
void UseNewDelete(void)
{
Obj *a = new Obj;//申请动态内存并且初始化
//...
delete a;//清除并释放内存
}
用malloc/free和new/delete实现对象的动态内存管理
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc与free不能执行构造函数和析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单很多。
所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于由于内部数据类型的“对象”没有构造与析构的过程,对它们而言,malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局?
因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上程序不会出错,但是该程序的可读性差。所以new/delete必须配对使用,malloc/free也一样。
面试时,面试官会经常问到malloc/free与new/delete的区别?
①malloc/free是C语言中提供的库函数。
new/delete是C++中的运算符。
②malloc可以在堆区分配空间,但是返回值是一个void *指针,使用时需要强转。
new使用的时候,不需要强转,可以直接通过指针来接收。
③new申请对象空间的时候,会调用对象的构造函数,而delete的时候,会调用析构函数。
而用malloc在堆区申请空间的时候,不会调用对象的构造/析构函数。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 有了malloc/free,为什么还要new/delete?

相关文章

  • 2017-05-26linux2.4.18----25.文件系统的构建
  • 2017-05-26Android开发学习—— Broadcast广播接收者,androidbroadcast
  • 2017-05-26悬浮对话框的实现,悬浮对话框实现
  • 2017-05-26Android常见问题及开发经验总结(三)
  • 2017-05-26关于使用底部菜单栏的使用。。。,使用底部菜单栏..
  • 2017-05-26Android自定义控件
  • 2017-05-26安卓开发 第一篇 关于依赖注入框架dagger2的使用和理解
  • 2017-05-26开发 Material Design+RxJava+Retrofit+MVP App 参考资料,rxjavaretrofit
  • 2017-05-26android动画详解三 动画API概述
  • 2017-05-26Android 面试题--Activity,android--activity

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 关于异地容灾的感触
    • android动画详解四 创建动画浅析
    • Xamarin android 的WebClient Json下载并存储本地及sqlite数据库,xamarinsqlite
    • 使用C++实现QML的TreeView Model (一)
    • 安卓当下最流行的吸顶效果的实现(转),安卓当下
    • Android中BroadcastReceiver的两种注册方式(静态和动态)详解,broadcastreceiver
    • 关于eclipse android 在manifest改app应用包名注意事项,androidmanifest
    • Android-BroadcastReceiver详解
    • 【Android】由浅到深理解AIDL
    • 位图索引(Bitmap Index)与数据DML LOCK场景问题解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有