当前位置: 首页 > 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.hskmm.com/?act=detail&tid=16887

相关文章:

  • [ABC422F-G] 题解
  • 别再靠 “关设备” 减碳!EMS 的 “预测性控能”,让企业满产也能达标双碳
  • LAMP 架构说明及部署实践 - 教程
  • MyEMS 深度解析:核心功能模块、数据流转逻辑与工业能源优化落地路径
  • kettle插件-国产数据库金仓插件,助力国产数据库腾飞
  • 制造业碳足迹追踪:开源能源管理系统如何助力企业实现“碳数据可视化”?
  • iframe安全盲区:支付信息窃取攻击的新温床 - 教程
  • 综合网表中有assign怎么办
  • 极限与导数
  • 呼叫中心开源社区专栏第一篇 - 详解
  • 原核表达可溶性蛋白难题破解
  • 深入解析:Adobe Fresco下载教程Adobe Fresco 2025保姆级安装步骤(附安装包)
  • Torch中的tensor size
  • Codeforces 1053 (Div.2)
  • 抗体药物偶联物(ADCs)生物分析:拆解 “靶向导弹” 体内轨迹的核心技术
  • 详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学
  • 使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案
  • 为什么应该测试无JavaScript的页面体验
  • 前台部分数据不显示
  • 指针定义以及二维数组内存地址(java/c++/python)
  • 解码数据结构线性表之顺序表
  • 中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃
  • Jupyter NoteBook / Jupyter Lab的安装与使用
  • 完整教程:科技的温情——挽救鼠鼠/兔兔的生命
  • 易基因:Nat Rev Drug Discov/IF101.8:何川团队顶刊综述RNA修饰系统作为疾病治疗靶点的研究进展
  • 国产适配 + AI 一键生成!亿图图示 14.5 全平台绘图指南:260 种图表 + Visio 兼容,开发者 / 办公党速藏
  • 关闭Cadence Allegro Design Entry CIS(OrCAD Capture)的Start Page
  • Mini L-CTF 2025 WP
  • K8S APIServer压力高,导致控制器Leader续约失败而重启问题
  • 【2025-09-24】连岳摘抄