• C++内存管理(new和delete)


    一、new 和 delete

    1.内置类型

    在C语言中,我们用的 malloc/calloc/realloc 来开辟空间

    我们可以发现,用上面这三种方式开辟空间总是需要强转,并且还要根据类型来计算需要开多少字节的空间,用起来不算很方便。

     使用new,开空间就会很方便,可以自动计算大小,不需要强转。

    int* p4 = new int[10];

    这两种开辟空间的方法,对于内置类型来讲都不会初始化。 

    用new开辟的空间,初始化也可以很简单,在后面加上{}即可,{}里面的内容就是你想要初始化的值,用“,”隔开

     

    我们可以看到,{} 内填几个值,就会将几个值初始化为你填的内容,后续的值会被初始化成0。 

    2.自定义类型

    对于自定义类型使用new会自动调用成员的构造函数。如下,a1已经被初始化了。

    但是如果你使用malloc,会发现没有办法去调用构造函数,因为构造函数是C++的内容,C语言的malloc不认识构造函数,你想显示调用也不行,因为函数是在类对象初始化的时候自动调用了,这是祖师爷创造new的根本所在。

    delete是配合new来一起使用的,new 出来的自定义类型会调用构造函数,delete 的自定义类型会调用析构函数。

    使用方法也很简单,用法为  delete +指针变量  

    对于开辟出来的数组,用法为 delete[]  + 指针变量

    上面使用的是默认构造,对于非默认构造,依然可以用  {}  来进行初始化 ,

    这里采用了隐式类型转化。

    二.malloc、new失败的区别 

    malloc开辟内存失败会返回一个空指针,

    new开辟内存失败会抛异常,需要用try catch去捕获这个异常,这里我们暂作了解。

    三、总结

    malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。

    不同的地 方是:

    1. malloc和free是函数,new和delete是操作符

    2. malloc申请的空间不会初始化,new可以初始化

    3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可

    4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

    5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需 要捕获异常

    6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理 

  • 相关阅读:
    2023P企业管理系统提供商,助力大中型企业一体化管理,免费更新
    6.SpringEL与List,Map
    《三体》:挑战宇宙秩序的科幻巅峰
    windows快捷键
    人工智能大模型及适用场景
    动作捕捉技术在四足仿生机器人研究中的应用
    【Flowable】任务监听器(五)
    ML.NET相关资源整理
    「AntV」L7地理可视化:从入门到实践
    Vue2 .sync修饰符的应用
  • 原文地址:https://blog.csdn.net/kkbca/article/details/133808632