new和malloc的区别深入解析

yizhihongxing

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日

相关文章

  • 解决异常FileNotFoundException:class path resource找不到资源文件的问题

    当我们在Java代码中引用一些资源文件(如XML、properties、txt等)时,有时候会出现FileNotFoundException: class path resource的异常,这是因为JVM在查找资源的时候默认是在当前类路径下寻找资源,如果找不到就会报这个异常。下面提供一个完整的攻略来解决这个问题: 1. 确认资源文件路径 首先,我们需要明确我…

    C 2023年5月23日
    00
  • PHP使用Http Post请求发送Json对象数据代码解析

    使用 HTTP POST 请求发送 JSON 对象数据是常见的网络编程需求。在 PHP 中,可以使用 CURL 扩展来实现这一过程。下面,我们来一步步详细讲解如何使用 PHP 发送 HTTP POST 请求以及发送 JSON 对象数据。 步骤 1 – 初始化 CURL 首先,我们需要初始化 CURL,如下所示: $curl = curl_init(); 步骤…

    C 2023年5月23日
    00
  • C中静态变量和寄存器变量的区别

    首先我们来看一下C语言中静态变量和寄存器变量的区别。 静态变量 定义 静态变量是指在函数或者代码块中定义的变量,其生命周期和程序的运行周期相同,不会在作用域结束后立刻销毁。 初始化 静态变量默认初始化为0。 作用域 静态变量的作用域与具体定义位置相关: 在代码块中定义的静态变量,它的作用域是该代码块; 在函数中定义的静态变量,它的作用域是整个函数。 不同源文…

    C 2023年5月10日
    00
  • C语言实现进程5状态模型的状态机

    关于“C语言实现进程5状态模型的状态机”的攻略,下面是我整理的一些内容。 状态机介绍 状态机(State Machine)可以将一个系统或者一个对象的现实行为转化为状态表或者状态图的形式,从而利用一定的算法去操作或者分析这个系统/对象。在计算机领域中,状态机通常被用于解决诸如网络协议、编译器、游戏AI等的逻辑控制问题。 在操作系统中,进程的状态机通常被分为5…

    C 2023年5月23日
    00
  • C语言编程入门必背的示例代码整理大全

    您好,关于“C语言编程入门必背的示例代码整理大全”的完整攻略,以下是详细讲解: 概述 此文档旨在为初学者提供C语言编程入门示例代码整理大全,内容包括语法基础、数组指针、结构体等知识点。示例代码将以最简单易懂的方式呈现,并加入详细注释,以帮助初学者更好地理解和学习。 语法基础 Hello World #include <stdio.h> int m…

    C 2023年5月23日
    00
  • C++函数对象Functor与匿名函数对象Lambda表达式详解

    C++函数对象Functor与匿名函数对象Lambda表达式详解 什么是函数对象? C++中的函数对象指的是重载了“()”运算符的类,可以像函数一样被调用,也被称为仿函数。与普通的函数不同的是,函数对象可以保存状态信息或者自定义行为,更加灵活。 在实现上,函数对象重载的“()”运算符应该是一个const成员函数,参数及返回值根据需要而定。函数对象的实现可以参…

    C 2023年5月22日
    00
  • C++中的vector容器对象学习笔记

    C++中的vector容器对象学习笔记 什么是vector容器对象? vector容器对象在C++中被定义为动态数组。它可以容纳许多类类型对象(int、double、bool、char等)。和其他数组不同的是,vector容器对象在创建后,可以根据需要动态地调整大小。这意味着可以动态添加或删除元素。 如何定义并初始化vector容器对象? 定义vector需…

    C 2023年5月23日
    00
  • Android NDK开发(C语言基本数据类型)

    Android NDK开发(C语言基本数据类型)攻略 什么是Android NDK? Android NDK(Native Development Kit)是一个允许您使用C和C++代码在Android设备上开发应用程序的工具集。NDK允许您在Android应用程序中使用底层C和C++代码,从而提高应用程序性能。使用NDK可以实现以下功能: 构建基于C/C+…

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