小学生学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、智能指针等工具就是在帮助我们减少这类内存管理错误。

相关新闻

APMCM证书与奖品发放全流程解析:从评审到接收的完整指南

APMCM证书与奖品发放全流程解析:从评审到接收的完整指南

1. 从“参赛”到“收获”:APMCM证书与奖品的完整交付流程解析 每年,当亚太地区大学生数学建模竞赛(APMCM)的评审工作尘埃落定,最牵动参赛者心弦的时刻莫过于等待证书和奖品发放。这不仅仅是一纸证明或一份实物&#xf…

2026/10/24 19:41:40 阅读更多 →
三维装箱与多目标优化:从算法原理到物流实践

三维装箱与多目标优化:从算法原理到物流实践

1. 项目概述与核心价值看到“2026年MathorCup杯D题多目标货物运输装箱策略优化”这个标题,很多参加过数学建模竞赛的朋友,尤其是对运筹优化、物流规划感兴趣的同学,估计眼睛都亮了。这不仅仅是一个赛题,它几乎是现实物流行业中“降…

2026/10/24 8:10:41 阅读更多 →
资源受限项目调度与人员排班优化:从数学建模到算法求解实战

资源受限项目调度与人员排班优化:从数学建模到算法求解实战

1. 项目概述:从赛题到实战的思维跃迁 又到了MathorCup开赛的季节,第十届B题一出来,我身边不少同学和学弟学妹就开始挠头了。这题看着像是个经典的优化问题,但细读下来,里面埋的“坑”和能做的“文章”可真不少。它本质…

2026/10/24 23:20:27 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →