讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中new和malloc有什么不同_c++动态内存分配方式比较

千宇同学_5078

千宇同学_5078

发布时间:2025-11-24 20:07:02

|

920人浏览过

|

来源于php中文网

原创

new是C++运算符,支持构造函数调用并可能抛出异常;malloc是C函数,仅分配原始内存且返回NULL表示失败。

c++中new和malloc有什么不同_c++动态内存分配方式比较

在C++中,new 和 malloc 都可以用来动态分配内存,但它们属于不同的内存管理机制,存在本质区别。理解这些差异有助于写出更安全、高效的代码。

1. 所属体系不同

new 是 C++ 的运算符,属于 C++ 语言级别的内存管理方式;而 malloc 是 C 标准库函数,定义在 <cstdlib>(或 <stdlib.h>)中,是 C 语言的内存分配手段。

这意味着:

  • new 能够与构造函数、析构函数、重载等 C++ 特性无缝配合
  • malloc 只负责分配原始内存块,不涉及对象语义

2. 内存分配失败时的行为不同

当内存不足导致分配失败时:

立即学习“C++免费学习笔记(深入)”;

  • 使用 new:默认抛出 std::bad_alloc 异常,程序可捕获并处理
  • 使用 malloc:返回 NULL 指针,需要手动检查返回值是否为 nullptr

例如:

int* p1 = new int;        // 分配失败会抛异常
int* p2 = (int*)malloc(sizeof(int));
if (p2 == nullptr) {      // 必须手动判断
    // 处理分配失败
}

3. 是否调用构造函数和析构函数

这是最关键的区别之一:

  • new 在分配内存后,会自动调用对象的构造函数进行初始化
  • malloc 仅分配指定大小的字节空间,不会调用任何构造函数

例如对于一个类类型:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
class MyClass {
public:
    MyClass() { cout << "构造函数被调用\n"; }
};
<p>MyClass<em> obj1 = new MyClass;           // 构造函数会被调用
MyClass</em> obj2 = (MyClass*)malloc(sizeof(MyClass)); // 不会调用构造函数

此时 obj2 指向的内存虽然足够存放对象,但并未初始化,直接使用成员函数可能导致未定义行为。

4. 内存释放方式不同

对应地,释放内存的方式也不同:

  • new 配套使用 delete:delete 会先调用析构函数,再释放内存
  • malloc 配套使用 free:只释放内存,不调用析构函数

错误混用会导致严重问题:

int* p = new int(10);
free(p);        // 错误!可能不会正确释放资源(尤其对类对象)
<p>int<em> q = (int</em>)malloc(sizeof(int));
*q = 20;
delete q;       // 错误!行为未定义

5. 类型安全性与语法简洁性

new 更加类型安全且语法简洁:

  • new 自动计算所需内存大小,无需手动指定
  • 返回指针自动匹配类型,不需要强制转换
  • malloc 必须显式传入 sizeof,并且返回 void*,需手动转换

示例对比:

int* a = new int;                    // 简洁清晰
int* b = (int*)malloc(sizeof(int));  // 冗长,易出错

6. 支持数组操作的方式不同

C++ 提供了 new[] 和 delete[] 来管理数组:

  • new[] 分配数组并逐个调用构造函数
  • malloc 无法体现数组元素的构造逻辑
MyClass* arr1 = new MyClass[5];         // 正确:调用5次构造函数
MyClass* arr2 = (MyClass*)malloc(5 * sizeof(MyClass)); // 危险:未初始化对象

基本上就这些。在现代 C++ 中,推荐优先使用 new/delete(或更高级的智能指针),避免直接使用 malloc/free,除非在特定场景(如与 C 代码交互、实现底层内存池等)。两者不能混用,否则会导致资源泄漏或程序崩溃。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5944

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2704

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1692

2025.10.17

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

351

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn