new和malloc的区别深入解析

new和malloc的区别深入解析

C++中,我们经常使用 newmalloc 来分配内存空间,但是二者有着一些区别。本文将深入分析 newmalloc 的区别,并且提供两个对比性的示例。

newmalloc 的区别

  1. 内存分配方式不同:new 是运算符,而 malloc 是C语言中的一个函数。
  2. 分配内存的类型不同:new 是 C++ 内存分配器,会在内存中创建一个对象并返回其指针,而 malloc 只分配一段内存,并不创建对象,需要手动调用构造函数初始化对象。
  3. 处理内存溢出的方式不同: 当 new 内存分配失败时,会抛出 std::bad_alloc 异常,而 malloc 在分配失败时会返回空指针 NULL(C++中可以使用 std::nothrow 避免抛出异常)。
  4. 内存大小不同: new 会自动计算需要分配的内存大小, malloc 则需要手动给定分配的内存大小。
  5. 可以直接重载operator new进行自定义内存分配,而malloc并不能自定义内存分配方式

示例1:使用 new 和 malloc 分别分配并初始化一个 int 数组

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int *pnData1 = new int[5];
    int *pnData2 = (int*) malloc(5 * sizeof(int));

    for(int i=0; i<5; i++)
    {
        pnData1[i] = i;
        pnData2[i] = i;
    }

    cout << "Displaying the values of the array allocated using 'new'" << endl;
    for(int i=0; i<5; i++)
    {
        cout << pnData1[i] << endl;
    }

    cout << "Displaying the values of the array allocated using 'malloc'" << endl;
    for(int i=0; i<5; i++)
    {
        cout << pnData2[i] << endl;
    }

    delete[] pnData1;
    free(pnData2);

    _getch();
    return 0;
}

在上述代码中,我们使用了 new 运算符和 malloc 函数来分别分配并初始化一个包含五个元素的 int 数组。然后,我们分别使用 for 循环对两个数组进行初始化。最后,我们对两个数组进行遍历,并将它们的值输出到控制台上。

在这个示例中,我们可以看到,使用 new 运算符分配数组时,我们不需要显式地给出数组的大小。而使用 malloc 函数时,我们必须手动计算内存分配空间大小。在释放内存时也有所不同。我们必须使用 delete 运算符来释放由 new 分配的内存,而使用 free 函数来释放由 malloc 分配的内存。

示例2:使用 new 和 malloc 分别分配并初始化一个 string 对象

#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;

class Person
{
public:
    char *name;
    int age;
public:
    Person(){};
    ~Person(){};
};

int main()
{
    Person *p1 = new Person();
    strcpy(p1->name, "Arya Stark");
    p1->age = 18;

    Person *p2 = (Person*) malloc(sizeof(Person));
    strcpy(p2->name, "Sansa Stark");
    p2->age = 20;

    cout << "Displaying the values of the Person created using 'new' : " << endl;
    cout << "Name: " << p1->name << endl;
    cout << "Age: " << p1->age << endl;

    cout << "Displaying the values of the Person created using 'malloc' : " << endl;
    cout << "Name: " << p2->name << endl;
    cout << "Age: " << p2->age << endl;

    delete p1;
    free(p2); 

    _getch();
    return 0;
}

在这个示例中,我们使用 new 运算符和 malloc 函数分别分配并初始化了一个 Person 类型的对象。 然后,我们使用 strcpy 函数为 name 成员赋值,将 age 的值设置为 18。 最后,我们采用 cout 对象将对象的属性输出到控制台。

在这个示例中,我们可以看到 new 运算符为类对象的分配和初始化提供了更高级别的抽象。 我们使用 destructor 函数和运算符“ delete ”来释放由 new 分配的内存。使用 free 函数和运算符" new "释放内存在各自的协调中,不能通用。

总结:在C++中使用 newdelete 运算符进行内存分配和释放是常见的方法;而 mallocfree 函数通常与C语言相关的库相关联,但如果你需要在C ++中进行内存分配,则可以使用它们。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:new和malloc的区别深入解析 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • c++ 实现文件逐行读取与字符匹配

    首先,需要明确我们要实现的功能是文件逐行读取,并且在每一行中与指定字符进行匹配。实现这个功能的一种主流方法是使用C++语言中的文件输入输出流以及字符串处理函数。 以下是C++进行文件逐行读取并匹配字符的代码示例: #include <iostream> #include <fstream> #include <string&gt…

    C 2023年5月22日
    00
  • C#生成随机数功能示例

    C#生成随机数功能示例 介绍 在C#中,生成随机数是一个常见的需求,它可以用于模拟测试数据、随机排序等场景。C#支持多种方式生成随机数,这里将向大家介绍两种常见的方法。 方法一:使用Random类生成随机数 Random类是C#内置的生成随机数的类,可以生成伪随机数序列。下面是一个使用Random类生成随机数的示例: Random rand = new Ra…

    C 2023年5月22日
    00
  • Linux系统下如何使用C++解析json文件详解

    下面是在Linux操作系统下如何使用C++解析Json文件的详细攻略。 1. 概述 在Linux系统下,C++解析Json文件的主要方式是使用第三方库,而rapidjson是其中一个被广泛使用的库,它提供了高性能、易使用、轻量级的Json解析功能,同时支持DOM(文档对象模型)和SAX(事件驱动)两种解析方式。接下来将以rapidjson为例,介绍如何在Li…

    C 2023年5月23日
    00
  • JS实现的合并多个数组去重算法示例

    JS实现的合并多个数组去重算法示例,主要分为以下几个步骤: 1.准备合并的多个数组 首先需要准备多个要合并的数组,可以使用数组字面量或者数组构造函数来创建一些示例数组。例如: const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; const arr3 = [6, 7, 8]; 2.合并多个数组 接下来需要将多个数组合…

    C 2023年5月23日
    00
  • Android中gson、jsonobject解析JSON的方法详解

    Android中gson、jsonobject解析JSON的方法详解 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JSON的数据格式来描述数据对象。JSON是一种数据存储格式,它和XML的作用类似,但JSON是一种轻量级的、更易于读写的数据格式。JSON中的数据可以是数组或对象,通过层级的…

    C 2023年5月23日
    00
  • C++用mysql自带的头文件连接数据库

    接下来我会为你详细讲解 “C++用mysql自带的头文件连接数据库”的完整攻略,包括安装MySQL和配置环境,以及如何使用MySQL头文件进行编程。 安装MySQL和配置环境 首先,你需要在你的计算机上安装MySQL。你可以在MySQL的官方网站 https://dev.mysql.com/downloads/ 下载MySQL的安装程序并按照提示进行安装。 …

    C 2023年5月22日
    00
  • makefile如何调用静态库的方法实现

    下面我会详细讲解makefile如何调用静态库的方法实现。 首先,让我们了解一下静态库和动态库的概念。 静态库:是一种链接(编译期)时归档库,它包含多个目标文件的归档文件。程序链接时这些目标文件的代码会被直接复制到可执行文件中,因此生成的可执行文件比较大。静态库的优点是使用起来比较方便,缺点是可执行文件比较大,占据较多的磁盘空间。 动态库:是一种在运行时(载…

    C 2023年5月23日
    00
  • 解决Win7系统启动防火墙提示错误0x8007042c的办法

    解决Win7系统启动防火墙提示错误0x8007042c的办法 问题描述 当我们启动Win7系统防火墙时,可能会遇到错误提示0x8007042c,导致防火墙无法正常工作。 解决办法 以下是解决Win7系统启动防火墙提示错误0x8007042c的具体步骤: 步骤1:检查Windows Firewall服务是否开启 首先,我们需要检查Windows Firewal…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部