C++ new 和 malloc 的区别
2021/11/21 12:10:39
本文主要是介绍C++ new 和 malloc 的区别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++ new 和 malloc 的区别
1.内存位置
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。
那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
2.返回类型
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。
3.分配失败处理
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。
4.调用构造函数
使用new操作符来分配对象内存时会经历三个步骤:
第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
第三部:对象构造完成后,返回一个指向该对象的指针。
5.调用析构函数
使用delete操作符来释放对象内存时会经历两个步骤:
第一步:调用对象的析构函数。
第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。
综合实践
代码
#include <iostream> #include <cstdlib> #include <limits.h> #define N 10 using namespace std; int main() { // 区别1. malloc 必须强制转换指针类型, 而 new 不用 int * p = (int *)malloc(N * sizeof(int)); int * q = new int[N]; delete [] q; free(p); // 区别2. 对于类的对象,new 会调用默认构造函数,而 malloc 只是单纯分配空间 class Car { public: Car(){cout << "Car()" << endl;} ~Car(){cout << "~Car()" << endl;} virtual int p(){cout << "virtual p()" << endl;} private: int price; }; Car * car_p = (Car *)malloc(sizeof(Car)); Car * car_q = new Car; cout << "sizeof(Car)=" << sizeof(Car) << endl;//应该是 8, 因为一个 int 4 字节,还有一个虚函数表指针 4 字节 // 区别3. 对于类的对象,delete 会调用析构函数,而 free 只是单纯释放空间 delete car_q; free(car_p); // 区别4. 对分配内存出现错误时,new 会抛出 bac_alloc 异常, malloc 会返回 NULL p = (int *)malloc(INT_MAX); if (!p) cout << "malloc failed" << endl; free(p); q = new int[INT_MAX]; delete []q; }
运行截图
这篇关于C++ new 和 malloc 的区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升