首页 > 其他分享 >8.new-delete操作与malloc-free的操作异同

8.new-delete操作与malloc-free的操作异同

时间:2023-07-03 21:25:12浏览次数:66  
标签:malloc free 分配内存 内存 new 分配 构造函数

相同点

●都可用于内存的动态申请和释放

●new和malloc都可以分配指定大小的内存块,并且分配的内存都在堆上。

●new和malloc的结果都返回一个指向已分配内存的指针。

●都允许使用字面量作为参数来分配内存。

不同点

●前者是C++运算符,后者是C/C++语言标准库函数

●new自动计算要分配的空间大小,malloc需要手工计算

●类型检查不同:new 会进行类型检查,确保在分配内存时,所分配的内存是正确的类型。如果类型不匹配,new 会抛出一个 std::bad_alloc 异常。而 malloc 不提供类型检查,可能会导致运行时错误。

●构造函数:new 会在分配内存后调用对象的构造函数(如果有定义)。这意味着在使用 new 分配的对象时,其成员变量已经被正确初始化。而 malloc 在分配内存后不会调用构造函数,因此需要手动为对象的成员变量赋初值。

●内存管理:newdelete 负责管理动态分配的内存。当使用 new 分配内存时,需要使用 deletedelete对指针所指对象运行适当的析构函数释放已分配的内存;同样,当使用 malloc 分配内存时,需要使用 free 释放已分配的内存。这有助于避免内存泄漏和悬空指针问题。

●new是封装了malloc,直接free不会报错,但是这只是释放内存,而不会析构对象

●异常处理:new 会抛出异常(如上述所述)以指示内存分配失败。而 malloc 可能返回一个空指针(即 NULL),或者返回一个无效的内存地址,这可能导致其他类型的错误。

总之,new 更安全、更易于维护,并提供了类型检查和自动内存管理功能。然而,它也具有一定的开销,因为它需要调用构造函数并负责释放内存。在许多情况下,使用 malloc 可能更适合,特别是在性能要求较高的场景中。

标签:malloc,free,分配内存,内存,new,分配,构造函数
From: https://www.cnblogs.com/codemagiciant/p/17524085.html

相关文章

  • 10.malloc和new的区别?
    malloc和free是标准库函数,支持覆盖;new和delete是运算符,支持重载。malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。malloc和free返回的是void类型指针......
  • 9.new和delete是如何实现的?
    new的实现过程是:首先调用名为operatornew的标准库函数,分配足够大的原始为类型化的内存,以保存指定类型的一个对象;接下来运行该类型的一个构造函数,用指定初始化构造对象;最后返回指向新分配并构造后的的对象的指针delete的实现过程:对指针指向的对象运行适当的析构函数;然后通过调用......
  • 12.被free回收的内存是立即返还给操作系统吗?
    不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝试从这些内存中寻找合适的返回。这样就避免了频繁的系统调用,占用过多的系统资源。同时ptmalloc也会尝试对小块内存进行合并,避免过多的内存碎片。......
  • 11.既然有了malloc-free,C++中为什么还需要new-delete呢?直接用malloc-free不好吗?
    malloc/free和new/delete都是用来申请内存和回收内存的。在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free,所以new/delete是必不可少......
  • FreeNAS系统基本安装篇
    一、FreeNAS介绍:1.1介绍FreeNAS是一套免费的NAS服务器,它能将一部普通PC变成网络存储服务器。该软件基于FreeBSD,Samba及PHP,支持CIFS(samba),FTP,NFSprotocols,SoftwareRAID(0,1,5)及web界面的设定工具。用户可通过Windows、Macs、FTP、SSH及网络文件系统(NFS)来访......
  • Freertos学习08-queue基本发送与接受
    一、前言队列是任务间通信的主要形式。它们可以用于在任务之间以及中断和任务之间发送消息。队列是一个先进先出(FIFO)的数据结构,类似于现实生活中的排队。任务可以将数据项放入队列的末尾,然后另一个任务可以从队列的开头取出这些数据项。这种方式可以实现任务之间的数据共享和通......
  • 非静态内部类newInstance
    https://stackoverflow.com/questions/25634542/newinstance-with-inner-classes Non-staticinnerclassesneedaninstanceoftheouterclasstoworkproperly.So,theydon't"really"haveadefaultconstructor,theyalwayshaveakindofhidd......
  • Tina_Linux打包流程说明指南_new
    OpenRemoved_Tina_Linux_打包流程_说明指南_new1概述1.1编写目的介绍Allwinner平台上打包流程。1.2适用范围Allwinner软件平台Tinav3.0版本以上。1.3相关人员适用Tina平台的广大客户,想了解Tina打包流程的开发人员。2固件打包简介固件打包是指将我们编译出来的bootloader......
  • 韦东山freeRTOS系列教程之【第四章】同步互斥与通信
    文章目录系列教程总目录概述4.1同步与互斥的概念4.2同步与互斥并不简单4.3各类方法的对比系列教程总目录本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的目录列表,目录列表页面地址:javascript:void(0)概述本章是概述性的内容。可以把多任务系统当做一个团队,......
  • 韦东山freeRTOS系列教程之【第十二章】资源管理(Resource Management)
    文章目录系列教程总目录概述12.1屏蔽中断12.1.1在任务中屏蔽中断12.1.2在ISR中屏蔽中断12.2暂停调度器系列教程总目录本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的目录列表概述在前面讲解互斥量时,引入过临界资源的概念。在前面课程里,已经实现了临界资源......