【北上广深杭大厂编程面试题】C++篇...这里介绍new、delete、malloc free之间的关系?

【北上广深杭大厂编程面试题】C++篇…这里介绍new、delete、malloc free之间的关系?

【北上广深杭大厂编程面试题】C++篇…这里介绍new、delete、malloc free之间的关系?


文章目录

  • 【北上广深杭大厂编程面试题】C++篇...这里介绍new、delete、malloc free之间的关系?
  • 前言
    • 1. `malloc` 和 `free`
      • `malloc`(Memory Allocation):
        • 特点:
      • free:
        • 特点:
      • 示例代码:malloc 和 free
    • 2. `new` 和 `delete`
      • `new`:
        • 特点:
      • `delete`:
        • 特点:
      • 示例代码:`new` 和 `delete`
        • 输出:
    • 3. new、delete 与 malloc、free 的关系与区别
    • 4. 总结:


欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议详细信息可参考:https://ais.cn/u/EbMjMn

前言

在 C++ 中,newdeletemallocfree 都是用于动态内存管理的操作符和函数,但它们之间有一些重要的区别和联系。下面将详细介绍它们的工作原理、区别和关系。

1. mallocfree

malloc(Memory Allocation):

  • malloc 是 C 语言中的动态内存分配函数,它在堆上分配一块指定大小的内存,并返回一个指向这块内存的指针。
  • malloc 的语法:
void* malloc(size_t size);

  • size 是要分配的内存块大小(以字节为单位)。
  • 如果分配成功,返回指向分配内存的指针;如果分配失败,返回 NULL
特点:
  • 没有构造函数malloc 仅分配内存,并不会初始化内存块中的内容。内存中的数据是未定义的(未初始化)。
  • 没有类型信息malloc 返回 void* 类型,需要强制转换成所需类型。
  • 无析构调用malloc 不会调用对象的析构函数,因此它仅适用于分配简单的内存块或基本数据类型。

free:

  • free 用于释放通过 malloccallocrealloc 分配的内存,返回的内存会被返回给操作系统。
  • free 的语法:
void free(void* ptr);

  • ptr 是指向分配内存的指针。
  • 如果 ptrNULL,调用 free 是安全的。
特点:
  • 释放内存后,指针变为悬空指针,不会自动重置为 NULL,因此需要小心使用。
  • free 不会调用析构函数,因此适用于没有构造或析构函数的简单数据结构。

示例代码:malloc 和 free

#include 
using namespace std;

int main() {
    // 使用 malloc 分配内存
    int* arr = (int*)malloc(5 * sizeof(int));
    if (arr == NULL) {
        cout << "Memory allocation failed!" << endl;
        return 1;
    }

    // 初始化分配的内存
    for (int i = 0; i < 5; ++i) {
        arr[i] = i + 1;
    }

    // 打印结果
    for (int i = 0; i < 5; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;

    // 使用 free 释放内存
    free(arr);

    return 0;
}

2. newdelete

new

  • new 是 C++ 中的运算符,用于动态分配内存并调用构造函数初始化对象。new 分配的内存空间不仅仅是原始的内存,它还可以根据需要进行类型转换和构造初始化。
  • new 的语法
Type* ptr = new Type;
Type* ptr = new Type[size];

  • 第一种形式是分配一个类型为 Type 的对象,并调用 Type 类的构造函数。
  • 第二种形式是分配一个 Type 类型的数组,并调用每个元素的构造函数。
特点:
  • 调用构造函数new 会调用对象的构造函数来初始化内存。
  • 返回类型安全的指针new 返回的是类型化的指针,无需显式转换类型。
  • 内存不足时抛出异常:如果无法分配内存,new 会抛出 std::bad_alloc 异常(C++ 中的 new 默认不返回 NULL,而是抛出异常)。

delete

  • delete 用于释放通过 new 分配的内存,并调用对象的析构函数。
  • delete 的语法:
delete ptr;
delete[] ptr;

  • delete 用于释放通过 new 分配的单个对象。
  • delete[] 用于释放通过 new[] 分配的数组。
特点:
  • 调用析构函数delete 会自动调用对象的析构函数来销毁对象并释放相关资源。
  • 类型安全delete 知道释放的是哪种类型的内存,因此不需要类型转换。
  • 防止内存泄漏delete 确保释放了内存和相关资源,避免内存泄漏。

示例代码:newdelete

#include 
using namespace std;

class MyClass {
public:
    MyClass() {
        cout << "Constructor called" << endl;
    }
    ~MyClass() {
        cout << "Destructor called" << endl;
    }
};

int main() {
    // 使用 new 分配内存并调用构造函数
    MyClass* obj = new MyClass();

    // 使用 delete 释放内存并调用析构函数
    delete obj;

    // 使用 new[] 分配内存
    int* arr = new int[5];
    delete[] arr;

    return 0;
}

输出:
Constructor called
Destructor called

3. new、delete 与 malloc、free 的关系与区别

【北上广深杭大厂编程面试题】C++篇...这里介绍new、delete、malloc free之间的关系?_第1张图片

4. 总结:

  • mallocfree 是 C 风格的内存管理方式,它们不考虑对象的构造和析构,适用于简单的内存分配和管理。它们在 C++ 中依然可以使用,但不适用于管理 C++ 对象的生命周期。
  • newdelete 是 C++ 提供的内存管理方式,支持动态内存分配并考虑构造和析构函数。new 适用于分配对象内存并初始化,delete 会调用析构函数并释放内存,确保对象的资源被正确释放。

尽管 mallocfree 在 C++ 中仍然可用,但更推荐使用 newdelete,尤其是在面向对象编程中,它们提供了更高的安全性和内存管理的自动化。

你可能感兴趣的:(计算机基础知识和编程,c++,java,面试,开发语言,编程)