C++ 中的new 和 delete 运算符及new和malloc的区别解析

 更新时间:2024年11月14日 14:42:21   作者:wqyc++  
在C++中,又引出了一个新玩法:new 和 delete,在C++中,new是用来动态开辟内存的,delete是用来释放我们所动态开辟的内存C++中的new和delete运算符及new和malloc的区别解析,感兴趣的朋友跟随小编一起看看吧

一、什么是new和delete

我们知道在C语言中,动态开辟内存的方法是使用:malloc/calloc/realloc。释放动态开辟的内存是free。在C++中,又引出了一个新玩法:new 和 delete。在C++中,new是用来动态开辟内存的,delete是用来释放我们所动态开辟的内存。

在C语言中,对内置类型的动态开辟我们经常使用的函数是malloc函数。在C++中,我们也可以使用new操作符来动态申请空间。注意:我们这里发现了malloc 和 new 的第一个区别,malloc是函数,new是一个操作符。当然,成对出现的free 是函数,delete 是操作符。我们先看其实用方法的对比,代码如下:

void Test()
{
    // 动态申请一个int类型的空间
    int* p1 = malloc(sizeof(int));
    int* p2 = new int;
    // 动态申请一个int类型的空间并初始化为10
    int* p3 = malloc(sizeof(int));
    *p3 = 10;
    int* p4 = new int(10);
    // 动态申请10个int类型的空间
    int* p5 = malloc(sizeof(int) * 3);
    int* p6 = new int[3];
    //释放
    free(p1);
    delete p2;
    free(p3);
    delete p4;
    free(p5);
    delete[] p6;
}

通过上面的使用对比,我们可以很明显的感觉到new和delete使用起来更加方便。因为我们在使用new动态开辟空间时,并不需要计算所开辟空间类型的大小。因为后面跟着类型,new会自动计算出类型的大小。

我们还发现,new在动态开辟内存时,还可以对其进行初始化。而malloc开辟后,才可通过解引用对其进行初始化。new在动态开辟数组时,也可对其进行初始化,但是这只是C++11才开始支持的语法,用法如下:

    int* p6 = new int[10]{1,2,3};
    delete[] p6;
    //后面没有给出的值,会自动初始化为0。

二、new和malloc的区别

new 和 malloc 的区别 :

1.malloc 是c语言库函数,new是运算符。
2.malloc 返回值必须强制类型转换,new的返回值不需要。
3.malloc 必须传入具体字节个数,new传入变量个数或者变量本身。 
4.malloc 申请失败会返回空,new会抛出异常。
5.使用new创建一个类的对象时会先调用malloc分配空间,然后再调用构造函数给成员变量赋值。   

6.在给自定义类申请空间时new和delete会自动调用构造函数和析构函数。

到此这篇关于C++ 中的new 和 delete 运算符及new和malloc的区别解析的文章就介绍到这了,更多相关c++ new 和 delete 运算符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ TCP网络编程详细讲解

    C++ TCP网络编程详细讲解

    TCP/IP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它会保证数据不丢包、不乱序。TCP全名是Transmission Control Protocol,它是位于网络OSI模型中的第四层
    2022-09-09
  • 使用C语言实现模糊搜索功能

    使用C语言实现模糊搜索功能

    本文所提到的模糊搜索是指输入不完整的关键词即可查询到对应的全部准确结果。下面小编通过实例代码给大家分享使用C语言实现模糊搜索功能,感兴趣的朋友一起看看吧
    2018-08-08
  • string,CString,char*之间的转化

    string,CString,char*之间的转化

    下面是MFC/C++/C中字符类型CString, int, string, char*之间的转换的说明与举例,经常用的东西,相信对于用C/C++的朋友,还是比较有用的
    2013-03-03
  • C++中Boost的智能指针scoped_ptr

    C++中Boost的智能指针scoped_ptr

    这篇文章介绍了C++中Boost的智能指针scoped_ptr,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C++通过SQLiteSDK增删改查的实现示例

    C++通过SQLiteSDK增删改查的实现示例

    SQLite是一种轻量级的嵌入式数据库,可以利用SQLiteSDK执行数据库的增删改查操作,本文主要介绍了C++通过SQLiteSDK增删改查,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • C++中引用和const关键字介绍

    C++中引用和const关键字介绍

    大家好,本篇文章主要讲的是C++中引用和const关键字介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 详解c++中signal信号携带数据的接收与发送

    详解c++中signal信号携带数据的接收与发送

    这篇文章主要为大家详细介绍了c++中signal信号携带数据的接收与发送的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C++函数重载的深入解析

    C++函数重载的深入解析

    在C++中,我们也能够把具有相同功能的函数整合到一个函数上,而不必去写好多个函数名不同的函数,这叫做函数的重载。以下是对C++中的函数重载进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • C++中两种字符串定义方式和区别介绍

    C++中两种字符串定义方式和区别介绍

    大家好,本篇文章主要讲的是C++中两种字符串定义方式和区别介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++四种cast使用详细介绍

    C++四种cast使用详细介绍

    本文主要介绍了C++四种cast使用详细介绍,今天我们要来讲的是显式类型转换,C++提供了四种显式类型转换,分别是:static_cast、dynamic_cast、const_cast、reinterpret_cast,感兴趣的可以了解一下
    2022-07-07

最新评论