小学生学C++编程语法知识(C++中new 和 malloc的区别)

📅 2026/8/14 6:29:02
小学生学C++编程语法知识(C++中new 和 malloc的区别)
我们先给同学们一个最重要的结论new是 C 的动态内存申请方式malloc是 C 语言的动态内存申请方式。C 中通常优先使用new更现代的 C 则更推荐智能指针、vector等方式。一、为什么需要new和malloc先看普通变量int x 10;我们让计算机创建一个int。但是有时候我们不知道程序运行后到底需要多少空间。比如老师说“今天来了多少个同学”如果来了 10 个int a[10];如果来了 100 个int a[100];可是如果我们运行程序以后才知道人数呢这时候就需要动态内存。也就是“程序运行的时候需要多少内存我再向计算机申请多少。”这就是new和malloc要解决的问题。二、new是什么最简单的例子int *p new int;这句话可以拆成两步理解new int ↓ 向系统申请一块能够存放 int 的内存 ↓ 返回这块内存的地址 ↓ 让 p 保存这个地址所以int *p new int;可以想象成p │ │ ▼ ┌─────────┐ │ int │ └─────────┘然后*p 100;就可以把100放进去。三、new可以直接初始化这是new非常方便的地方。例如int *p new int(100);意思就是申请一个int的空间并且把它初始化成100。相当于p │ ▼ ┌─────────┐ │ 100 │ └─────────┘还可以double *p new double(3.14);甚至string *p new string(hello);这就是 C 的一个重要特点new不仅仅是申请内存还可以调用对象的构造函数完成初始化。这一点后面会非常重要。四、申请完了以后怎么办动态申请的内存不会像普通变量一样自动消失。所以int *p new int(100);使用完以后我们需要delete p;完整代码int *p new int(100); cout *p endl; delete p; p nullptr;这里形成一个非常重要的配对new ↓ 申请内存 ↓ 使用 ↓ delete ↓ 释放内存一定要记住new对应delete。五、那么malloc是什么malloc是 C 语言提供的动态内存申请函数。需要#include cstdlib例如int *p (int*)malloc(sizeof(int));这句话是什么意思我们一步一步看。sizeof(int)表示一个int需要多少字节。例如很多系统中sizeof(int)结果是4所以malloc(sizeof(int))就是“帮我申请能够放下一个int的这么多字节。”六、malloc和new最直观的区别看看Cint *p new int;Cint *p (int*)malloc(sizeof(int));它们都可以申请动态内存。但是写法完全不同。可以简单理解成new │ ├── C的 ├── 直接写类型 ├── 可以初始化 └── 可以调用构造函数 malloc │ ├── C语言的 ├── 只知道申请多少字节 ├── 不负责对象初始化 └── 不调用构造函数七、最大的区别之一new知道“类型”比如int *p new int(10);new知道我要创建的是一个int。所以它知道应该申请 int 的空间 ↓ 创建 int 对象 ↓ 初始化而malloc(sizeof(int))本质上只是“给我一块这么大的内存。”它并不知道“我要创建一个什么 C 对象。”这个区别在学习类以后特别重要。八、new可以调用构造函数这是 C 学习中非常非常重要的一点。假设我们有一个类class Student { public: Student() { cout 学生出生了 endl; } };然后Student *p new Student();会发生new Student() ↓ 申请内存 ↓ 创建 Student 对象 ↓ 调用 Student 的构造函数 ↓ 输出 学生出生了也就是说new不只是申请内存还负责“创建对象”。九、malloc不会调用构造函数如果强行拿malloc来处理 C 类对象就会遇到非常重要的问题。例如class Student { public: Student() { cout 构造函数 endl; } };使用Student *p (Student*)malloc(sizeof(Student));这里malloc只是申请了一块内存。不会自动调用Student()所以new Student() ↓ 申请内存 ↓ 调用构造函数 ↓ 真正创建对象而malloc(...) ↓ 申请一块原始内存 ↓ 不会调用构造函数这也是为什么C 中创建对象应该使用new而不是用malloc。十、释放内存的方式也不一样这是第二个必须记住的区别。newint *p new int(10); delete p;对应new → deletemallocint *p (int*)malloc(sizeof(int)); free(p);对应malloc → free千万不要混用十一、千万不要这样写错误①int *p new int(10); free(p);不应该这样。因为new应该对应delete错误②int *p (int*)malloc(sizeof(int)); delete p;也不应该这样。因为malloc应该对应free十二、为什么不能混用可以把它想象成两套不同的“借东西系统”。系统 Anew ↓ C动态内存系统 ↓ delete系统 Bmalloc ↓ C动态内存系统 ↓ free你不能A系统借东西 ↓ B系统还东西也不能B系统借东西 ↓ A系统还东西因此记住new↔deletemalloc↔free十三、还有一个特别重要的区别数组new可以非常方便地申请数组。例如int *p new int[10];意思动态申请 10 个int。使用p[0] 10; p[1] 20;最后delete[] p; p nullptr;注意这里不是delete p;而是delete[] p;因为new int ↓ delete new int[10] ↓ delete[]这是另一个非常重要的配对关系。十四、malloc也可以申请数组例如int *p (int*)malloc(10 * sizeof(int));表示申请可以放下 10 个int的内存。释放free(p);所以申请释放new intdeletenew int[10]delete[]malloc(...)free()十五、把new和malloc放在一起比较对比newmalloc来自哪里CC本质C运算符C函数是否知道类型✅❌只知道字节数是否可以初始化✅❌是否调用构造函数✅❌返回值对应类型的指针void*释放deletefree数组new[]malloc计算总字节数C中推荐一般优先于 malloc通常不推荐直接使用十六、还有一个区别申请失败时这个属于稍微进阶一点的知识。例如int *p new int;如果内存申请失败默认情况下new会抛出std::bad_alloc而malloc(...)申请失败时通常返回nullptr例如int *p (int*)malloc(sizeof(int)); if (p nullptr) { cout 申请内存失败; }同学们现在不用死记只需要知道new和malloc不仅写法不同它们连“申请失败后的处理方式”也不同。十七、最重要的问题C是不是应该大量使用new这里我要特别提醒初学 C 的同学不要因为学会了new以后所有东西都写new。例如int *p new int(10);很多情况下根本没有必要。直接int x 10;就很好。如果需要动态数组现代 C 通常更推荐vectorint a(10);而不是int *p new int[10];因为vector会自动管理内存。你不用记delete[]也不用担心很多内存管理问题。十八、所以现代 C的思想是什么可以把 C 的内存管理发展理解成最原始 malloc / free ↓ C语言风格 C new / delete ↓ 可以创建对象 可以调用构造函数 现代 C vector string unique_ptr shared_ptr ↓ 尽量让程序自动管理资源所以学习顺序可以是先学malloc/free理解“内存就是一块空间”再学new/delete理解“C不仅管理内存还要管理对象”最后学习 RAII、智能指针、vector理解“尽量不要让程序员自己管理内存”。十九、给同学们一个“魔法仓库”的故事假设计算机是一座巨大的仓库。malloc你对仓库管理员说“给我一块40 字节的空间。”管理员“好的。”他不关心你准备干什么。malloc(40) ┌────────────────────────┐ │ 40字节空间 │ └────────────────────────┘new你说“请给我一个Student对象。”管理员知道“哦你要的是一个 Student”于是new Student() ↓ 申请空间 ↓ 创建 Student ↓ 调用 Student 构造函数所以malloc 更像“给我一块空房间”。new 更像“帮我建好一个房间并把里面的东西初始化好”。二十、最后用一句话彻底记住如果考试问C 中new和malloc有什么区别可以从这几个关键词回答第一层new是 C 的malloc是 C 的。第二层new按类型申请内存malloc按字节数申请内存。第三层new可以初始化对象并且会调用构造函数malloc不会调用构造函数。第四层new对应deletenew[]对应delete[]malloc对应free。第五层现代 C 中很多情况下应该优先使用vector、string、智能指针等自动管理资源的工具而不是手动new/delete。最后送给同学们一个非常好记的口诀malloc我要一块内存new我要一个 C 对象malloc → freenew → deletenew[] → delete[]现代 C能不用手动管理就尽量不用手动管理。这也正好和上一课的野指针、悬空指针连起来new/delete用得不规范很容易制造悬空指针而现代 C 的vector、智能指针等工具就是在帮助我们减少这类内存管理错误。