qidao123.com技术社区-IT企服评测·应用市场

标题: C++ new/delete和malloc/free的区别(面试总结) [打印本页]

作者: 风雨同行    时间: 2025-4-20 07:46
标题: C++ new/delete和malloc/free的区别(面试总结)

性质

malloc/free 是C语言中的标准库函数,用于动态内存管理;
new/delete 是C++中的操作符,底层调用了 malloc/free。

分配方式

malloc、free
  1. int* arr = (int*)malloc(10 * sizeof(int)); // 分配
  2. free(arr); // 释放
复制代码
代码含义:

new、delete
  1. int* val = new int(42);    // 分配并初始化
  2. delete val;                // 释放
复制代码
代码含义:

特性malloc/freenew/delete范例安全返回void*,需逼迫转换返回该范例对象的指针内存巨细手动计算主动分配
内存区域

malloc函数从堆上分配内存,而new在自由存储区(free store)上分配内存。
无论是使用 ​​malloc​ 还是 ​​new​​,内存分配初始都在​​虚拟内存上​​,​​物理内存的分配是延迟的​​(由操作体系的​​按需分页机制​​控制)

malloc 举动
仅分配虚拟内存,不触发物理内存分配,首次访问内存(写入或读取)时才分配物理内存。
  1. int* arr = (int*)malloc(1024 * sizeof(int));  // 仅虚拟内存分配
  2. arr[0] = 10;  // 首次写入触发缺页异常,分配物理内存
复制代码
new 举动
为对象分配虚拟内存地点,并调用构造函数,构造函数初始化内容可能隐含首次内存访问,从而间接触发物理分配。
  1. class MyClass {
  2. public:
  3.     int data;
  4.     MyClass() { data = 42; }  // 写入data操作触发缺页异常,分配物理内存
  5. };
  6. MyClass* obj = new MyClass(); // 物理内存在构造函数执行时分配
复制代码
  1. class MyClass {
  2. public:
  3.     int data;  // 未初始化
  4.     MyClass() {}  // 无内存访问
  5. };
  6. MyClass* obj = new MyClass(); // 物理内存未分配,直到后续访问obj->data
复制代码

底层实现

malloc/free
仅管理内存,不涉及构造/析构函数的调用
分配空间重要有两种方式(brk,mmap)

new/delete
new 和 delete 都是 C++ 的关键字,new 的举动分为 内存分配 和 对象构造 两部,delete 的举动分为 ​对象析构​​ 和 ​​内存释放​​ 两步。
new:
1.operate new(起首调用全局的 operator new 函数分配内存,默认实现基于 malloc);
2.申请充足的空间;
3.调用构造函数,初始化变量。
delete:
1.调用析构函数;
2.operate delete(默认实现调用 free);
3.释放空间。

失败处置惩罚

malloc 在内存分配失败时返回 NULL,需手动查抄返回值。
必须显式查抄返回值,并且无异常机制,完全依赖流程控制。
new 在内存分配失败时抛出异常(std::bad_alloc)​​
异常机制主动流传错误,适合面向对象和复杂场景,如果构造函数抛出异常,已分配的内存会被主动释放。

重载能力

malloc/free 是C语言标准库的预定义函数,在链接时绑定到标准库实现,没法通过语言特性直接替换它们。
new/delete 可以通过重载 operator new 和 operator delete 来自定义动态内存分配和释放的举动。
  1. class MyClass {
  2. public:
  3.     // 重载类的数组 new[]
  4.     static void* operator new[](size_t size) {
  5.         std::cout << "类内 new[]: 分配数组 " << size << " 字节\n";
  6.         void* p = malloc(size);
  7.         if (!p) throw std::bad_alloc();
  8.         return p;
  9.     }
  10.     // 重载类的数组 delete[]
  11.     static void operator delete[](void* p) noexcept {
  12.         std::cout << "类内 delete[]: 释放数组内存\n";
  13.         free(p);
  14.     }
  15. };
  16. int main() {
  17.     MyClass* arr = new MyClass[5]; // 触发类的 operator new[]
  18.     delete[] arr;                  // 触发类的 operator delete[]
  19.     return 0;
  20. }
复制代码

小结

本文重要从分配方式、内存存储、失败处置惩罚以及重载能力几个方面介绍了 malloc/free 和 new/delete 的区别,希望能对你有资助!




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4