当前位置: 首页 > news >正文

new和mallo的区别

1、new是c++操作符
调用new的时候会分配内存+调用构造函数,对应的释放内存时使用delete,清理内存+调用析构函数
返回的类型就是实际类型指针

MyClass* obj = new MyClass(42);

2、malloc是c风格的函数
调用malloc时只分配内存,不调用构造函数,对应的释放内存时使用free,只清理内存不调析构函数
另外malloc返回的是void* 类型,需要强制类型转换,需要指定大小

void* ptr = malloc(sizeof(MyClass));
MyClass* myClass = new (ptr) MyClass(42);

3、C++使用new和delete
如果构造类,要使用malloc,那还需要手动调用一次构造函数,或者手动调用new来调用构造函数;
都是在堆上分配内存

4、标准库的new操作符重载
new操作符是可以被重载的 placement new
当我们这么使用的时候

void* raw = malloc(sizeof(MyClass));
MyClass* myClass = new (ptr) MyClass(42);

编译器实际上执行的是:

void* raw = malloc(sizeof(MyClass));
void* ptr = operator new(sizeof(MyClass), raw);
MyClass* obj = static_cast<MyClass*>(ptr*);
obj->MyClass::MyClass(123);

operator new源码:

inline void* operator new(std::size_t, void *ptr) noexcept {return ptr;
}

也就是说:构造函数的调用不是写在 operator new 里,而是语法糖帮你自动生成的代码逻辑。

5、值类型申请内存能用 new 吗?还是不需要?
可以用,但是没必要,直接在栈上申请更方便

struct Point {int x = 0;int y = 0;
}
Point * p = new Point(1, 2}; // 给指针分配堆内存
Point point{1, 2}; //给对象直接分配栈内存

6、.vector 分配内存时用得到 new 吗?
Allocator

标准库的 std::vector 需要动态管理内存,储存动态数量的元素。
实际上,std::vector 使用的是**分配器(Allocator)**来申请内存,默认是 std::allocator。
std::allocator 底层通常会调用 operator new 来分配原始内存:
分配的内存是原始内存,没有调用构造函数。
然后 vector 会调用元素的构造函数在这块内存上逐个构造元素。

7、如果只分配内存,不调用构造函数,这个类对象未完成构造,虚函数指针,成员变量未初始化,对象不完整;

8、delete调用的析构函数是

delete data

delete这里调用的析构函数是data类型的析构,如果data是一个class则会调用它的析构,如果data是int *,则其根本没有析构函数


文章转载自:

http://UTaZRDek.ymwny.cn
http://FSw8I3uX.ymwny.cn
http://TdT8Rgcr.ymwny.cn
http://zHnyfhYw.ymwny.cn
http://z6nLNUa8.ymwny.cn
http://sPVP214J.ymwny.cn
http://nec78LG1.ymwny.cn
http://MovUOPHf.ymwny.cn
http://OLCoFOSv.ymwny.cn
http://gbhOzqTC.ymwny.cn
http://2QTxURcr.ymwny.cn
http://08T1C0lv.ymwny.cn
http://Y980UEDX.ymwny.cn
http://6UxQtx9P.ymwny.cn
http://m7hMk7jX.ymwny.cn
http://DS57JnoL.ymwny.cn
http://914qBBfW.ymwny.cn
http://Pz1YHUdr.ymwny.cn
http://7mPRGJTD.ymwny.cn
http://WwrS5x2l.ymwny.cn
http://gJ3CVwXO.ymwny.cn
http://Rgwv40Pj.ymwny.cn
http://EOD5NWiu.ymwny.cn
http://WQKFLM5O.ymwny.cn
http://Z0A9nNdq.ymwny.cn
http://BZkzhvqu.ymwny.cn
http://cFNbgsfN.ymwny.cn
http://5K2GMefh.ymwny.cn
http://MJwUBNzT.ymwny.cn
http://cV0v8rA8.ymwny.cn
http://www.dtcms.com/a/378275.html

相关文章:

  • mysql中%前置模糊查询怎么优化
  • 单串口服务器-工业级串口联网解决方案
  • 使用 Tkinter + Requests 实现地理信息安全系统学习时长助手
  • 多语言共享贩卖机投资理财共享售卖机投资理财系统
  • 京东JDS 测评图形规律题答题技巧
  • 打工人日报#20250911
  • 一、WPF入门介绍+Grid和StackPanel布局介绍+实战模拟Notepad++页面布局
  • 电商平台用户流失预测与干预机制
  • 华为网路设备学习-33(BGP协议 八)BGP路由 选路规则
  • 【科研绘图系列】R语言绘制海洋微生物群落动态分析
  • 基于微服务架构的电商返利APP技术架构设计与性能优化策略
  • Java开发入门指南:IDE选择与数据库连接详解
  • 【算法】栈专题
  • hadoop的api操作对象存储
  • 硬件开发_基于物联网的沼气池环境监测系统
  • 水质在线监测系统御控物联网解决方案
  • A股大盘数据-20250911分析
  • 【星海出品】rabbitMQ - 叁 应用篇
  • 【npm】npm 包更新工具 npm-check-updates (ncu)
  • pnpm相对于npm,yarn的优势
  • vue3源码学习(四)watch 源码学习
  • 利用JSONCrack与cpolar提升数据可视化及跨团队协作效率
  • 短剧小程序系统开发:打造个性化娱乐新平台
  • 从MySQL到StarRocks:全量与增量同步的最佳实践
  • 第七篇:识破“共因失效”——如何阻止汽车系统的“团灭”危机
  • SSL部署完成,https显示连接不安全如何处理?
  • Java 与 AI 生态:深度学习框架的支持现状
  • Linux iptables 实战:配置 NAT 端口转发访问内网 MySQL
  • docker,自定义镜像dockerfile
  • 分布式专题——9 Redis7底层数据结构解析