卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与语法

  • 面向对象

  • STL 与容器

  • 内存管理

    • C++内存分区,堆和栈的区别
    • new和melloc的区别是什么?
      • 简要回答
      • 详细回答
      • 代码示例
      • 知识拓展
    • free和delete区别的是什么?
    • placement new的作用
    • 什么是内存泄漏?什么是野指针?什么是内存越界?如何避免?
    • 内存碎片与内存溢出
    • 如何避免内存碎片
  • C++11 与现代 C++

  • 智能指针

  • 并发与 I/O

# new和melloc的区别是什么?

# 简要回答

new和malloc的区别体现在:

new是c++的运算符,malloc是c的库函数,new不仅分配内存,还会调用构造函数,new分配失败会抛出异常,malloc分配失败返回NULL,new用delete释放,malloc用free释放。

# 详细回答

  1. 内存分配:new无需指定内存块大小(自动计算);malloc需要显式指定所需内存的大小(手工计算)
  2. 内存分配失败:new不会返回NULL,而是会抛出bad_alloc异常;malloc会返回NULL
  3. 是否调用构造/析构函数:new/delete会调用类中的构造/析构函数;malloc不会
  4. 是否能够重载:new/delete能够重载;malloc/free不能重载
  5. 本质:new/delete是C++运算符;malloc/free是C++标准库函数,在使用时需要加入头文件
  6. 类型安全:new 安全;malloc不安全
  7. 返回类型:new返回的是定义时具体类型的指针;malloc返回void *类型的指针,使用时需要强制转换
  8. 数组支持:new支持new[],malloc需要手动计算大小

# 代码示例

// 使用 new
MyClass* obj = new MyClass(10);  // 自动构造
delete obj;                      // 自动析构

// 使用 malloc
MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 只分配,不构造
obj->MyClass(10); // 错误写法!不能手动调构造
free(obj);        // 不会调用析构函数
1
2
3
4
5
6
7
8

# 知识拓展

  • 知识图解 image

  • 什么时候用? 可以参考这个表格

运用场景 推荐选择 为什么
C++ 中创建对象 new 类型安全,构造+析构
C 代码中或和 C 交互的模块 malloc 没有 new,只能用 malloc
使用 POD 类型(无构造/析构) malloc 省事、效率高,像 char*
自定义对象生命周期或池化 new 或 placement new 灵活管理构造过程
分配未初始化的内存块 malloc 快,但要注意初始化风险
STL容器内部或RAII环境 new 和智能指针等现代C++配套
  • 面试官可能追问
  1. new 和 malloc 的底层实现有什么区别?

答:是否直接调用 brk/sbrk,是否用 operator new,构造函数的作用等。malloc 底层可以直接用 brk/sbr,new不会直接调用,而是通过 operator new间接实现。

补充:这里的brk/sbrk是系统调用,用于向操作系统申请或调整用户进程的堆内存边界。 它的调用顺序:所以 new → operator new → malloc → sbrk / mmap(操作系统底层)。现在brk/sbrk 已不推荐使用,替代方案是 mmap/munmap:其更灵活、线程安全、支持匿名页。

  1. 能否用 malloc 分配对象后手动调用构造函数?

答: 可以通过placement new 的方法,比如:

void* mem = malloc(sizeof(MyClass));
MyClass* obj = new (mem) MyClass(); // placement new
1
2

3.new[] 和 new 的区别?为什么 delete[] 不能用 delete 替代?

答:new[] 会记录元素个数,用于后续批量调用析构;delete 只析构一个。

  • 简记

new 是 C++ 的对象级操作,负责 “分配 + 构造”; malloc 是 C 的内存级操作,只管 “分配”,不管活不活(构造)。

Last Updated: 3/10/2026, 6:08:48 PM

← C++内存分区,堆和栈的区别 free和delete区别的是什么? →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪