【C++】论malloc与new在计算机底层的相同点和不同点

在C++中有一个新的关键字new,与C语言中的malloc的差异较大,但是从底层来讲是类似的,本文主要是底层结构及工作流程本别讲述new与malloc的相同点和不同点。

1、相同点

  1. 动态内存分配:两者都允许程序在运行时动态地请求内存。
  2. 返回指针:都会返回一个指向分配内存区域的指针(类型可能不同)。
  3. 需要手动释放 :分配的内存都需要手动释放以避免内存泄漏。对于 new 使用 delete,对于 malloc 使用 free

2、不同点

2.1、类型安全性和初始化

new是C++特有的动态空间申请方法,new可以理解为是以对象为单位去申请空间,但是new一个对象时会调用对象的构造函数进行初始化。如下图所示,都是通过new申请的空间并自动调用构造函数进行初始化,同时将对象的地址给d1和d2。

当然如果使用new去申请一个对象数组,申请的形式与上图稍有差别,如下图所示,在C++11中允许使用花括号去初始化对象数组,当然如果不使用花括号编译器也会自己调用对象的构造函数去初始化数组中的每个对象。

综上所述,new是C++特有的操作符,支持类型安全的内存分配;可以直接分配类对象,并自动调用构造函数进行初始化;支持数组形式的新分配方式(如 new[])。


malloc是C语言中库函数,malloc相比于new就比较粗暴,malloc可以理解为以字节为单位去申请空间,并且malloc不会对申请空间进行初始化,即所做的事就是如字面所示:申请空间。

是C标准库中的函数,不支持类型安全的内存分配;分配的是未初始化的内存块,不会调用构造函数;返回的是 void* 类型的指针,通常需要显式转换为所需类型的指针。

2. 内存分配失败处理

new如果内存分配失败,默认情况下会抛出 std::bad_alloc 异常;可以使用无抛出版本的 new 来改变这种行为(例如 new(std::nothrow)),在这种情况下,如果分配失败则返回 nullptr。本文讨论的是抛异常版本。

所以在new中一般会搭配try-catch去检查new是否成功申请空间了。


malloc如果内存分配失败会返回nullptr。所以在使用malloc后,需要使用判断语句查看返回的指针是不是nullptr来判断申请空间是否成功。

3. 语法和灵活性

new的语法更加简单,相比于malloc,new是以对象为单位去申请空间,所以在申请过程中,new不需要计算实际申请了多少空间而只需要表明需要申请多少个对象即可。

相关推荐
yi碗汤园20 小时前
【一文了解】C#的StringComparison枚举
开发语言·前端·c#
Larry_Yanan20 小时前
QML学习笔记(十九)QML的附加信号处理器
开发语言·笔记·qt·学习·ui
某不知名網友20 小时前
I/O 多路转接之 epoll:高并发服务器的性能利器
开发语言·php
郝学胜-神的一滴21 小时前
深入理解 C++ 中的 `std::bind`:功能、用法与实践
开发语言·c++·算法·软件工程
1白天的黑夜121 小时前
优先级队列(堆)-1046.最后一块砖的重量-力扣(LeetCode)
c++·leetcode·优先级队列
努力学习的小廉21 小时前
我爱学算法之—— 模拟(上)
c++·算法
zhangfeng113321 小时前
wgcna 相关性热图中4个颜色 4个共表达模块 的模块基因是否都要做GO/KEGG分析”,核心取决于你的**研究目标和模块的生物学意义*
开发语言·r语言·生物信息
come1123421 小时前
Go 语言中的结构体
android·开发语言·golang
仰泳的熊猫21 小时前
LeetCode:496. 下一个更大元素 I
数据结构·c++·算法·leetcode
bkspiderx21 小时前
C++设计模式之行为型模式:职责链模式(Chain of Responsibility)
c++·设计模式·责任链模式