malloc free; new delete

new/delete、new[ ]/delete[ ]这两组运算符一定要匹配使用!
当对象为数组时使用[]delete,若分配的内存为一个int,char,或者自定义的结构体(非结构体数组),则不需要[]。

malloc/free只是动态分配/释放内存空间,而new/delete除了分配/释放空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。
operator new 和 operator delete只是malloc和free的一层封装。

delete时候不需要检查NULL,但是free一般需要

假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:
*string stringarray1 =static_cast<string>(malloc(10 * sizeof(string)));
string stringarray2 = new string[10];
其结果是,stringarray1确实指向的是可以容纳10个string对象的足够空间,但内存里并没有创建这些对象。而且,如果你不从这种晦涩的语法怪圈(详见条款m4和m8的描述)里跳出来的话,你没有办法来初始化数组里的对象。换句话说,stringarray1其实一点用也没有。相反,stringarray2指向的是一个包含10个完全构造好的string对象的数组,每个对象可以在任何读取string的操作里安全使用。

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。绝对不可以混用,往往有很多基于C语言的库使用了malloc,虽然new更好用。
对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

Tips:目前发现对于子函数分配new,主函数释放delete的操作,如果分配后内容为空,即未写入内容,且对应地址不是null,这时主函数delete不会报错,其实这时即使使用free来对应new也不会报错,当然使用了free后不能再使用delete。
如果实在要在另外一个地方释放内存,则定义的时候使用静态内存,即固定好大小,像数组一样使用,只不过可分配的空间要大多了,毕竟使用的是堆的空间。这样也不会报错。

实际上;就算没有free(),main()结束后也是会自动释放malloc()的内存的,这里监控者是操作系统,设计严谨的操作系统会登记每一块给每一个应用程序分配的内存,这使得它能够在应用程序本身失控的情况下仍然做到有效地回收内存。主要是为了防止内存溢出或浪费。

对于内存连续性
如果是内置的类型,malloc和new的作用是相同的,分配的都是连续(逻辑上)的空间(如果内存足够且连续),在碰到class之类的自定义类型里,用new时,会自动调用类的构造函数,用delete会自动调用类的析构函数,如果用free,则无法执行相关的操作。
堆分配的空间在逻辑地址(即我们使用看到的指针)上是连续的,但在物理地址上是不连续的(因为采用了页式内存管理,windows下有段机制、分页机制),如果逻辑地址空间上已经没有一段连续且足够大的空间,则分配内存失败。

每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆(尽管为不同类型分配内存使用多个堆的情况也是有的。
栈附属于线程,因此当线程结束时栈被回收。堆通常通过运行时在应用程序启动时被分配,当应用程序(进程)退出时被回收。从这个角度来看,栈好像是一个{}。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值