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

C++ new 操作符在操作系统层执行了什么操作?

C++ new 操作符在操作系统层执行了什么操作?

在C++中,new操作符的执行涉及操作系统层面的内存分配和对象构造过程,具体可分为以下几个关键步骤:

1. 调用内存分配函数(operator new)

new操作符首先通过operator new函数向操作系统申请内存。该函数底层通常调用malloc或类似的系统调用(如brk/mmap),从堆空间分配指定大小的内存块。若内存不足,默认会抛出std::bad_alloc异常。

2. 计算所需内存大小

根据对象类型(内置类型或自定义类),new会计算所需内存大小,包括考虑内存对齐和类成员变量的空间占用。对于数组,还需额外存储数组大小信息以便后续析构。

3. 调用构造函数初始化对象

内存分配成功后,new会在该内存上调用对象的构造函数完成初始化。对于自定义类型,构造函数负责初始化成员变量;内置类型(如int)则直接赋初值。

4. 返回对象指针

最终,new返回指向已构造对象的指针,供程序使用。若构造函数抛出异常,已分配的内存会自动释放以避免泄漏。

5. 与malloc的底层区别

malloc仅通过brk(小内存)或mmap(大内存)系统调用分配虚拟内存,而new还包含构造步骤。 new失败时抛出异常,malloc返回NULL;new支持重载operator new实现自定义分配策略。

操作系统交互示例 ‌

小内存(<128KB)‌:通过brk调整堆顶指针_edata,延迟分配物理内存(首次访问时触发缺页中断)。
大内存(≥128KB)‌:通过mmap在文件映射区域分配虚拟内存。

综上,new的操作系统交互核心是通过operator new触发底层内存分配系统调用,并协调构造/析构语义,确保类型安全。

问题思考:
1. 系统调用brk 和 mmap 有什么不同?
2. new 为数组开辟内容空间的时候,数组大小这个额外的信息是如何存储的? int * p = new int[5]; 指针p 指向的的int 数据地址还是数组大小的地址?
3. new 是可以被重载的,能否为特定的类设计对象池分配策略?
4. new 失败时会抛出异常, 能否改造不抛出异常?

http://www.rkmt.cn/news/11516.html

相关文章:

  • [ABC422F-G] 题解
  • c# Listdynamic 按字段排序
  • 双活、异地多活架构怎么设计才不翻车? - 教程
  • 制造业碳足迹追踪:开源能源管理系统如何助力企业实现“碳数据可视化”?
  • iframe安全盲区:支付信息窃取攻击的新温床 - 教程
  • 综合网表中有assign怎么办
  • 极限与导数
  • 深入解析:文献阅读 | iMetaMed | FigureYa:一个标准化可视化框架,用于增强生物医学数据解释和研究效率
  • 单独
  • 为什么应该测试无JavaScript的页面体验
  • 完整教程:UE5小游戏开发 - 武士决斗
  • PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE
  • 一款不错的PDF工具,吾爱出品 - 教程
  • 完整教程:科技的温情——挽救鼠鼠/兔兔的生命
  • 关闭Cadence Allegro Design Entry CIS(OrCAD Capture)的Start Page
  • K8S APIServer压力高,导致控制器Leader续约失败而重启问题
  • 8K 视频修复提速 50%!Topaz Video AI 7.0.0 实战指南:AI 增强 + 本地化模型 + GPU 加速全解析
  • vivo 浏览器福利体系架构演进之路
  • 2024JCR最新完整版期刊名单!【附带21-23年完整版表格】
  • python 数组的赋值和copy 和deepcopy
  • 深入解析:SQL server 2022下载安装详细教程
  • 详细介绍:npm玩转技巧
  • 软件构造的基本原理 1章
  • 【2025-09-23】性格问题
  • Gitee DevOps:国产研发效能平台的破局之道
  • 开发实用软件
  • 代码随想录算法训练营第八天 | leetcode 344 541 卡特54
  • PolarFire SOC Auto Update 和 IAP 文档阅读二
  • 实用指南:《前端学习总结:GitLab、状态管理、组件库与 Umi.js》
  • java21学习笔记-未命名的模式和变量 - 指南