从网上看的学习之

1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+“、”-“、”*“、”/“有一样的地位。

2. new/delete是可以重载的,而重载之后,就成为了函数。 
3. malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,必须要强转成需要的类型。 
4. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。 
5. new/delete,其实内部也调用了malloc/free。
 
两者的共同点有: 
1. 都必须配对使用,防止内存泄露。 
2. 都可用于申请动态内存和释放内存,都是在堆中分配内存。 
3. free和delete可以释放NULL指针。
 
 
(2)用法上也有所不同
函数malloc 的原型如下:
void * malloc(size_t size);
用malloc 申请一块长度为length 的整数类型的内存,程序如下:
int *p = (int *) malloc(sizeof(int) * length);
我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。
1、malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。
2、 malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。
函数free 的原型如下:
void free( void * memblock );
为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free
对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。
 
 
1、new自动计算需要分配的空间,而malloc需要手工计算字节数
2、new是类型安全的,而malloc不是,比如:
        int* p = new float[2]; // 编译时指出错误
        int* p = malloc(2*sizeof(float)); // 编译时无法指出错误
new operator 由两步构成,分别是 operator new 和 construct
3、operator new对应于malloc,但operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上。而malloc无能为力
4、new将调用constructor,而malloc不能;delete将调用destructor,而free不能。
5、malloc/free要库文件支持,new/delete则不要。
 
 

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

  1. class Obj
  2. {
  3. public:
  4. Obj( )
  5. { cout  <<  "Initialization"  <<  endl; }
  6. ~ Obj( )
  7. { cout  <<  "Destroy" <<  endl; }
  8. void Initialize( )
  9. { cout  <<  "Initialization"  <<  endl; }
  10. void  Destroy( )
  11. { cout  <<  "Destroy"  <<  endl; }
  12. }obj;
  13. void  UseMallocFree( )
  14. {
  15. Obj   * a  =  (Obj  *) malloc( sizeof ( obj ) );      //  allocate memory
  16. a -> Initialize();                                    //  initialization
  17. // …
  18. a -> Destroy();                                        // deconstruction
  19. free(a);                                               // release memory
  20. }
  21. void  UseNewDelete( void )
  22. {
  23. Obj   * a  =   new  Obj;
  24. // …
  25. delete a;
  26. }

类Obj的函数Initialize实现了构造函数的功能,函数Destroy实现了析构函数的功能。函数UseMallocFree中,由于
malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成“构造”与“析构”。所以我们不要用
malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言
malloc/free和new/delete是等价的。

2、联系
既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C
程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用
delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete、malloc/free必
须配对使用。

个人理解补充:

(1)mallloc和free是c/c++标准库函数,准确的说是c89标准,c++标准库又包含了c89标准,所以都有,malloc是通过一个freelist方法连接的,实际上malloc一个指定字节在内存中分配的比申请的多了一个头,这个头用来记录容量和对齐用,返回时返回头后的空闲空间(详细见c程序设计那本书)。free也是还给给freelist表,这里会有相邻的合并什么的,free函数会向前移动一个头字节,然后找到头,就知道容量了,然后合并空闲空间。

(2)malloc/free只是单纯的进行内存空间的分配和释放,而使用new/delete时,不仅分配了内存空间,若new/delete的是一个类,还会调用类的构造函数或析构函数。new和delete是一个运算符operater new和operater delete,可以重载operater new或delete,但要注意是否有遮掩情况。

new 在系统中默认实际的流程是有个死循环,不断的尝试申请内存,申请不到就会不断调用new_handler函数,只有当new_handler函数为NULL时,才会抛出bad_alloc异常,new_handler可以通过std::set_new_handler(handler aaa);设置,返回旧的handler。new也可以处理0字节的申请,是把0字节申请在内部修改为1字节申请,然后正常运行的。

系统默认有3个new

template <typename T>                       //忘了怎么写了,回去看看effective c++补上。

new_hander operater new (     ,void *) throw(bad_alloc)   placement new

new_hander opearter new () throw (bad_alloc)

new_hander operate  new (   ,std:nothrow) throw()

对应有3个delete

placement new 只有在分配成功但是在copy 构造函数失败时,运行系统负责调用对应的placement delete

所以重载时或有继承时注意遮掩问题用using base::new,using base::delete,把名称加入到作用域中。

(3)free的处理是,如果是空指针就不做处理,不是空指针在继续

 

malloc free 和new delete区别的更多相关文章

  1. malloc/free 与 new/delete 区别

    malloc/free 是c++/c的标准库函数,new/delete 是c++的运算符.两者都可以申请动态内存和释放内存.对于非内部数据类型的对象而言,光用malloc/free是无法满足动态对象的 ...

  2. malloc/free与new/delete的区别

    相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...

  3. malloc/free和new/delete的区别汇总

    一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回 ...

  4. new和malloc区别,delete和delete []区别

    面试被问到上述问题,所以特地总结一下: 一.new和malloc的区别. 1.new可以返回指定类型的指针,并且自动分配内存大小:malloc需要计算手动计算分配空间的大小,并且返回值需要强转为实际类 ...

  5. malloc/free与new/delete的区别与联系

    相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...

  6. c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义

    4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...

  7. 百度笔试题:malloc/free与new/delete的区别(转)

    百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和d ...

  8. malloc/free和new/delete的区别

    转自:http://blog.csdn.net/chance_wang/article/details/1609081 malloc与free是C++/C语言的标准库函数,new/delete是C++ ...

  9. malloc,free和new,delete之间的区别

    1.malloc free 是c语言里面的,不过在c++中也能使用,这个只是申请的一块内存,一般不能申请对象的内存空间:2.new delete,是c++的,申请的也是一块内存,只是这个可以申请对象. ...

随机推荐

  1. 制作Mac OS X Mavericks 安装U盘

    1. 8G+ U盘一个. 2. App Store 下载Maverics到本地(默认会下载到Applications) 2. 打开Mac OS 磁盘工具(Disk Utility),左侧选中U盘,在右 ...

  2. CentOS 6.X更新Python2.7.x版本 安装pip

    在安装新版之前安装 先安装bz2.zlib,执行下列代码进行安装 yum install -y zlib-devel bzip2-devel xz-libs wget openssl openssl- ...

  3. 【Groovy】入门布道ppt

    Groovy Outline• Hello world• Smooth Java integration• Flat learning curve• Powerful features 跟 Java ...

  4. 【JSF框架】 是一种标准

    典型的JSF应用程序包含下列部分: 一组JSP页面 一组后台bean(为在一个页面上的UI组件定义的属性和函数的JavaBean组件) 应用程序配置资源文件(定义页面导航规则.配置bean和其它的自定 ...

  5. UI表单

    Monk.UI表单美化插件诞生记!   阅读目录 背景 预览效果 表单组件 普通文本框 多行文本框 复选框 切换滑块 单选框 下拉选择框 数字输入框 时间选择 文件选择 显示文本 按钮 开源地址 背景 ...

  6. 怎么查看和修改 MySQL 的最大连接数?

    一. 查看Mysql当前配置 MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看 mysql> show variables like '%connections ...

  7. http://blog.csdn.net/carolzhang8406/article/details/7196011

    http://blog.csdn.net/carolzhang8406/article/details/7196011

  8. H2O与Java线程同步

    Java 5以前的线程同步采用syncronized和wait,notify,notifyAll来实现,比较粗糙.之后有了Lock和Condition.ReentrantLock的简单lock,unl ...

  9. session跨域共享解决方案

    要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...

  10. ANDROID_MARS学习笔记_S01原始版_021_MP3PLAYER001_下载mp3文件

    一.简介 1.在onListItemClick()中new Intent,Intent以存储序列化后的mp2Info对象作为参数,启动serivce 2.DownloadService在onStart ...