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

new的几种形式

C++ 中的 new 操作符实际上有多种形式,根据使用方式和功能可分为如下几类:


✅ 一、基本形式

1. 普通单对象分配

MyClass* p = new MyClass();         // 默认构造
MyClass* p2 = new MyClass(123);     // 调用带参构造函数

2. 数组形式

MyClass* arr = new MyClass[10];     // 分配并构造 10 个默认构造的对象

必须配对使用 delete[],否则只析构第一个对象!


✅ 二、带 nothrow 的安全形式(避免异常)

MyClass* p = new(std::nothrow) MyClass();
if (!p) {// 分配失败,不抛异常,返回 nullptr
}

适用于资源有限、不能容忍异常的系统(如嵌入式设备)。


✅ 三、Placement new(定址构造)

已有内存上构造对象,常用于自定义内存池、共享内存等场景。

void* buffer = malloc(sizeof(MyClass));
MyClass* p = new (buffer) MyClass(123); // 定址构造

注意:

  • 不会分配内存,只调用构造函数;

  • 析构必须显式调用:p->~MyClass();


✅ 四、重载版本(类或全局)

你可以重载 operator new 来控制分配行为:

void* MyClass::operator new(std::size_t size) {std::cout << "custom new\n";return ::operator new(size);
}
void MyClass::operator delete(void* ptr) {std::cout << "custom delete\n";::operator delete(ptr);
}

还可以写成 全局重载版本,或接受额外参数用于调试/分区管理。


✅ 五、对齐版本(C++17 起)

struct alignas(64) AlignedClass {int data;
};AlignedClass* p = new AlignedClass();  // 自动 64 字节对齐

也可以自定义重载如下:

void* operator new(std::size_t size, std::align_val_t align);

✅ 六、数组 + Placement + 对齐的组合形式(不推荐混用)

可以组合使用,如:

void* mem = malloc(sizeof(MyClass) * 10);
MyClass* arr = new (mem) MyClass[10]; // 错误!数组不能用 placement new 这样构造!

new T[n]placement new 不兼容数组构造,要显式循环手动构造:

for (int i = 0; i < 10; ++i)new (static_cast<void*>(mem) + i * sizeof(MyClass)) MyClass();

🔁 全部形式简表

形式示例特点
普通 newnew MyClass(1)分配 + 构造
普通 new[]new MyClass[10]构造多个对象
nothrow newnew(std::nothrow) MyClass()分配失败返回 nullptr,不抛异常
Placement newnew (ptr) MyClass(1)在已有地址构造,不分配内存
自定义重载 operator newMyClass::operator new(...)控制分配策略
对齐 new(C++17)new (std::align_val_t(64)) MyClass()用于 SIMD / 硬件对齐需求
数组 + 对齐 new(复杂慎用)new (std::align_val_t(64)) MyClass[10]实现复杂,通常不推荐

✅ 总结一句话:

C++ 中 new 不只是“分配内存”,它是类型感知的对象创建机制,支持构造、析构、对齐和自定义行为,远比 malloc 灵活强大。

相关文章:

  • Python 数据智能实战 (7):智能流失预警 - 融合文本反馈
  • 创意效率双提升,AIGC让增长更轻盈
  • Spring Boot中集成Guava Cache或者Caffeine
  • 第 1 篇:起点的选择:为何需要超越数组与链表?
  • 菲索旋转齿轮法:首次地面光速测量的科学魔术
  • 信息收集新利器:SSearch Chrome 插件来了
  • ROPE(旋转位置编码)简述
  • 当神经网络突破摩尔定律:探索大模型时代的算力新纪元
  • AimRT从入门到精通 - 03Channel发布者和订阅者
  • PDF智能解析与知识挖掘:基于pdfminer.six的全栈实现
  • 【论文阅读一】掌握高效阅读法,开启学术研究新旅程:S. Keshav教授论文阅读的三遍法
  • 华为OD机试真题 Java 实现【水库蓄水问题】
  • 杭电oj(1180、1181)题解
  • 【算法应用】基于鲸鱼优化算法WOA求解VRPTW问题
  • 《缓存策略:移动应用网络请求的“效能密钥” 》
  • 【数据库】四种连表查询:内连接,外连接,左连接,右连接
  • 文章三《机器学习基础概念与框架实践》
  • 【Android】Intent
  • LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用
  • LeetCode算法题 (移除链表元素)Day15!!!C/C++
  • 巴菲特第60次股东大会开场点赞库克:他为伯克希尔赚的钱比我还多
  • 国羽3比0横扫日本晋级苏迪曼杯决赛,将战韩国与印尼胜者
  • 中国驻旧金山总领馆:领区发生旅行交通事故,有中国公民伤亡
  • 中央气象台:未来三天北方地区有大风沙尘,江南等地有强降水
  • 党旗下的青春|赵天益:少年确定志向,把最好的时光奉献给戏剧事业
  • 李强签署国务院令,公布修订后的《中华人民共和国植物新品种保护条例》