首页 > 其他分享 >malloc/free 和 new/delete的区别

malloc/free 和 new/delete的区别

时间:2024-09-03 21:52:34浏览次数:5  
标签:malloc int free 内存 new delete

malloc/freenew/delete 是 C++ 中两种不同的动态内存管理方法,它们有一些关键的区别:

1. 内存分配和释放机制

  • mallocfree:

    • 函数: malloc 是一个 C 标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个 void* 指针,指向分配的内存块的起始位置。free 用于释放由 malloc 分配的内存,防止内存泄漏。
    • 初始化: malloc 仅分配内存,但不调用构造函数,因此分配的内存内容是未初始化的。
    • 类型转换: 因为 malloc 返回的是 void*,在 C++ 中需要进行显式类型转换。
    int *arr = (int*)malloc(10 * sizeof(int));  // 分配10个int的内存空间
    free(arr);  // 释放内存
    
  • newdelete:

    • 运算符: new 是一个运算符,用于分配内存,并且调用对象的构造函数来初始化分配的内存。delete 是相应的运算符,用于释放由 new 分配的内存,并调用对象的析构函数。
    • 初始化: new 分配内存并同时调用构造函数,因此分配的内存是已初始化的。
    • 类型安全: new 不需要显式的类型转换,直接返回指向指定类型的指针。
    int *arr = new int[10];  // 分配10个int的内存空间并初始化
    delete[] arr;  // 释放内存并调用析构函数
    

2. 类型安全

  • malloc/free: 因为 malloc 返回 void*,它与特定类型无关,需要显式地进行类型转换。因此,类型检查完全依赖于程序员的注意。
  • new/delete: new 是类型安全的,因为它直接返回指向特定类型的指针,不需要进行显式的类型转换,编译器可以进行类型检查。

3. 调用构造函数和析构函数

  • malloc/free:

    • malloc 只分配内存,不调用对象的构造函数。
    • free 只释放内存,不调用对象的析构函数。这在处理复杂对象时可能导致资源泄漏。
  • new/delete:

    • new 分配内存并调用构造函数。
    • delete 释放内存并调用析构函数。这使得 new/delete 更适合管理包含资源的复杂对象,如文件句柄、网络连接等。

4. 内存分配失败的处理

  • malloc/free:

    • malloc 分配失败时返回 NULL,程序员需要手动检查返回值并处理错误。
    int *arr = (int*)malloc(10 * sizeof(int));
    if (arr == NULL) {
        // 处理分配失败
    }
    
  • new/delete:

    • new 分配失败时会抛出 std::bad_alloc 异常(除非使用 nothrow 版本的 new),这允许使用 C++ 的异常处理机制。
    try {
        int *arr = new int[10];
    } catch (std::bad_alloc &e) {
        // 处理分配失败
    }
    

5. 用途

  • malloc/free:

    • malloc/free 更适合 C 语言或在 C++ 中需要兼容 C 代码的场景,主要用于分配原始内存块。
    • 不适用于需要对象构造和析构的场景。
  • new/delete:

    • new/delete 是 C++ 提供的内存管理机制,更适合 C++ 对象的内存分配和管理。
    • 支持对象的构造和析构,适用于动态创建复杂对象。

总结

  • malloc/free 是 C 语言的内存管理函数,分配和释放原始内存块,不涉及对象的构造和析构,适合需要分配未初始化内存的场景。
  • new/delete 是 C++ 运算符,分配和释放内存时会调用构造函数和析构函数,适合在 C++ 中动态管理对象。new 提供了类型安全,并在内存分配失败时抛出异常。

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

标签:malloc,int,free,内存,new,delete
From: https://blog.csdn.net/2303_77208351/article/details/141873048

相关文章

  • 【FreeRTOS】事件组的本质
    目录0前言1事件组讲解2事件组概念与操作2.1事件组的概念2.2事件组的操作3事件组函数3.1创建3.2删除3.3设置事件3.4等待事件3.5同步点4示例:广播5示例:等待任意一个事件6示例:等待多个事件都发生0前言学习视频:【FreeRTOS入门与工程实践--由浅......
  • 结构体如何使用指针呢?两种方法,第一种是静态内存管理,不能用delete回收内存。第二种,使用
    问题描述:根据下列代码和结果回答下列问题。代码://Createdby黑马程序员.#include"iostream"usingnamespacestd;intmain(){structStudent{stringname;intage;stringgender;};//先创建一个标准的结构体对象(......
  • 科技宅必备!FreeMove让程序搬家像呼吸一样简单
    前言凡益之道,与时偕行。当今社会发展日新月异;在这个数据爆炸、存储空间日益珍贵的时代,如何高效管理我们的数字资产,特别是如何在有限的硬盘空间中灵活布局各类应用程序,成为了我们不得不面对的问题。正是在这样的背景下,FreeMove这一创新工具应运而生,它不仅体现了技术对于空间优......
  • kimi:如何分析是哪个接口调用了最多次的operator new[]接口?
    如何分析是哪个接口调用了最多次的operatornew[]接口?重载operatornew[]:你可以在你的程序中重载operatornew[],记录每次调用时的调用栈信息。#include<iostream>#include<fstream>#include<new>#include<cstdlib>#include<execinfo.h>//包含backtrace函数#inc......
  • Vmware 上安装部署免费开源NAS系统FreeNAS11.3操作系统(支持CIFS (samba), FTP, NFS,
    说明FreeNAS®于2005年首次跃上互联网,在过去的十年里,它已成为一个家喻户晓的名字,在全球拥有超过1000万次下载和100万次部署。FreeNAS是一套免费的NAS(网络附加存储)服务器解决方案,它基于FreeBSD和Python开发,能够将一台普通的PC转变为功能强大的网络存储服务器。概述类型:NA......
  • What's new in PikiwiDB(Pika) v3.5.5
    尊敬的社区朋友及PikiwiDB(Pika)用户们:非常高兴地宣布---PikiwiDB(Pika)【下文简称Pika】长期维护版本v3.5的最新版本---v3.5.5今天正式发布。在这个版本中,除了修复所有已知的主从复制bug外,通过引入RTC特性其性能又有了大幅度提升,且主从failover机制兼容了Redis-Se......
  • 使用 ...new Set 在 filtred 数组中添加计数重复值
    你可以使用newSet和filter方法来计算数组中重复值的数量。以下是一个示例代码:constarr=[1,2,2,3,3,3,4,4,4,4];constfilteredArr=arr.filter((item,index,self)=>self.indexOf(item)===index);constset=newSet(filteredArr);constcount=fil......
  • STM32F1+HAL库+FreeTOTS学习8——第一个任务,启动!
    STM32F1+HAL库+FreeTOTS学习8——第一个任务,启动!开启任务调度器1.函数vTaskStartScheduler()2.函数xPortStartScheduler()启动第一个任务1.函数prvStartFirstTask()2.函数vPortSVCHandler()上一期我们学习了列表和列表项的相关内容和API函数实验,接下来我们......
  • 关于at32f415 free rtos下使用flash储存数据flash db库在写入数据库操作时,写入次数大
    由于f415的扇区每2k是一块扇区,所以在此处.blk_size=n*1024, //Flash块/扇区大小(因为STM32F2各块大小不均匀,所以擦除粒度为最大块的大小:128K)这个代码中,需要m==2,同理,需要查看你的单片机每个扇区的大小是多少,如果一个扇区的大小是4k,则此处需要填写的是由于f415的扇区每2......
  • Linux内存操作之free命令
    在Linux操作系统中,free命令是一个非常重要的工具,用于显示系统内存(包括物理内存和交换空间)的使用情况。基本语法free[选项]常用选项-b或--bytes:以字节为单位显示内存信息。-k或--kilo:以千字节(KB)为单位显示内存信息。-m或--mega:以兆字节(MB)为单位显示内存信息(这......