首页 > 其他分享 >new和malloc

new和malloc

时间:2024-08-16 13:26:51浏览次数:12  
标签:malloc 函数 int 关键字 new 构造函数

"new"和"malloc"都是在C++和C语言中用于动态分配内存空间的关键字/函数。

  1. "new"关键字:在C++中,"new"关键字用于在堆上动态分配内存空间。它可以像以下方式使用:

    int* ptr = new int; // 动态分配一个int类型的空间
    

    "new"关键字会自动计算所需的内存大小,并返回一个指向分配内存的指针。在上面的例子中,"ptr"指向了新分配的int类型的内存空间。

  2. "malloc"函数:在C语言中,"malloc"函数用于动态分配内存空间。它需要传入所需的内存大小,并返回一个指向分配内存的指针。可以像以下方式使用:

    int* ptr = (int*)malloc(sizeof(int)); // 动态分配一个int类型的空间
    

    注意,"malloc"函数返回的是void*类型的指针,需要进行类型转换。在上面的例子中,通过(int*)进行了类型转换,将返回的指针转换为int*类型。

    new和malloc底层原理

    malloc 底层实现:

    当开辟的空间小于 128K 时,调用 brk ()函数;当开辟的空间大于 128K 时,调用 mmap()。 malloc 采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将 堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。

    new 底层实现: 关键字 new 在调用构造函数的时候实际上进行了如下的几个步骤:

    1. 创建一个新的对象

    2. 将构造函数的作用域赋值给这个新的对象(因此 this 指向了这个新的对象)

    3. 执行构造函数中的代码(为这个新对象添加属性)

    4. 返回新对象

    new和malloc的区别

    1. new 是操作符,而 malloc 是函数。

    2. new 在调用的时候 先分配内存,在调用构造函数,释放的时候调用析构函数 ;而 malloc 没有构造函数和析构函数。

    3. malloc 需要给定申请内存的大小, 返回的指针需要强转; new 会调用构造函数,不用指定内存的大小,返回指针不用强转。

    4. new 可以被重载 ; malloc 不行

    5. new 分配内存更直接和安全 。

    6. new 发生错误抛出异常 , malloc 返回 null

不同之处:

  • "new"是C++中的关键字,而"malloc"是C语言中的函数。
  • "new"关键字可以自动计算所需的内存大小,而"malloc"函数需要手动传入所需的内存大小。
  • "new"关键字会自动调用构造函数,"malloc"函数仅分配内存,不会对分配的空间进行初始化。

需要注意的是,如果使用"new"关键字分配内存空间,则需要使用"delete"关键字释放内存空间;如果使用"malloc"函数分配内存空间,则需要使用"free"函数释放内存空间。

标签:malloc,函数,int,关键字,new,构造函数
From: https://blog.csdn.net/weixin_62789590/article/details/141019140

相关文章

  • postgres.new:在浏览器中构建与AI协作的开源Postgres沙盒
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • NewsBreak助力美国护肤品品牌电商广告推广优势
    在数字化浪潮席卷全球的今天,广告推广已不仅仅是企业营销的单一手段,更是塑造品牌形象、扩大市场份额、提升用户粘性的重要途径。特别是在美国这个全球最大的经济体之一,电商行业的蓬勃发展更是为各类品牌带来了前所未有的机遇与挑战。NewsBreak,作为美国一款备受欢迎的新闻资讯平......
  • C/C++ 动态分配:malloc()和free()所涉及的空指针和强制类型转换、与new和delete的对比
    1、动态分配的内涵所谓动态内存分配,是指在程序运行时根据需要分配和释放内存,而不是在编译时确定内存需求。动态分配包括两方面的内涵:在堆上分配内存。对于linux的虚拟内存,可以分成以下5段:文本段、数据段(分初始化和未初始化数据段)、堆和栈。不使用动态分配定义一个变量,这个变......
  • var reg = new RegExp(“(^|&)“ + name + “=([^&]*)(&|$)“, “i“)匹配
    vargetQuery=function(name){ varreg=newRegExp("(^|&)"+name+"=([^&]*)(&|$)","i"); varr=window.location.search.substr(1).match(reg); if(r!=null) return(r[2]); returnnull; };}去网上查了一些资料......
  • c语言替换字符串 Replace the first ‘oldstr‘ with ‘newstr‘ in ‘srcstr‘
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • To create a new mock, the existing static mock registration must be deregistered
    1、异常提示:Tocreateanewmock,theexistingstaticmockregistrationmustbederegistered  2、原因分析由提示信息可知,静态模拟已经注册过了,再次注册时必须先将之前的撤销。所以我们要撤销之前的注册信息,再执行。这里提供另一种方法,将模拟静态的方法......
  • C语言和C++中的动态内存管理------malloc和free的区别
    引言:动态内存管理:需要根据具体情况来设定需要的内存大小,同时可能需要大于1Mbyte的连续空间。此时我们无法使用静态数组。原因是因为静态数据的开辟是在栈空间,其次栈空间的大小在连续分配时不能超过1Mbyte,因此引入了动态内存管理。C语言C语言中动态内存管理的有四个函数:mal......
  • JS中关于为什么调用构造函数要使用new的详细解读
    在JavaScript中,使用new关键字调用构造函数是创建新对象的关键步骤。本文将从以下几个方面解释为什么要这样做:1.创建一个新的对象当你用new调用构造函数时,会自动创建一个新的空对象,这个对象会被赋值给this,即构造函数内部的this关键字会引用这个新创建的对象。fu......
  • vscode step into出现Could not load source './malloc/./malloc/malloc.c': 'SourceR
    问题:使用stepinto调试c语言内建函数时就会出现解决:1.使用stepover跳过调试c语言内建函数2.将launch.json的工作目录设置为c库目录对于debian系统sudoaptinstallglibc-sourcecd/usr/src/glibc/sudotar-xvfglibc-2.36.tar.xz最后在launch.json设置"cwd":"/us......
  • 枚举、typedef、位运算、堆内存-malloc 函数
    目录枚举定义枚举值枚举类型枚举的优点枚举的注意事项示例程序总结typedef基本用法复杂数据类型的重命名位运算位移操作总结堆内存malloc 函数free 函数常见问题枚举定义在C语言中,枚举(enum)是一种数据类型,它允许定义一组具名的常量。使用枚举可以使代码......