跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ new 运算符
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C++ new运算符}} '''C++ new运算符'''是C++中用于动态内存分配的核心操作符,它允许程序在运行时从堆(heap)中请求内存空间。与C语言的<code>malloc()</code>不同,new不仅分配内存,还会调用对象的构造函数,是面向对象内存管理的关键工具。 == 基本语法与功能 == new运算符的基本语法如下: <syntaxhighlight lang="cpp"> pointer_variable = new data_type; pointer_variable = new data_type[size]; // 数组分配 pointer_variable = new data_type(initial_value); // 带初始化 </syntaxhighlight> === 工作原理 === 当使用new时,会发生以下步骤: # 计算所需内存大小 # 在堆上寻找连续可用空间 # 调用构造函数(对于类对象) # 返回指向该内存的首地址指针 <mermaid> graph TD A[调用new] --> B[计算内存大小] B --> C[堆空间分配] C --> D[调用构造函数] D --> E[返回指针] </mermaid> == 基础示例 == === 单对象分配 === <syntaxhighlight lang="cpp"> #include <iostream> int main() { int* ptr = new int; // 分配一个int空间 *ptr = 42; // 存储值 std::cout << *ptr; // 输出: 42 delete ptr; // 必须手动释放 return 0; } </syntaxhighlight> === 数组分配 === <syntaxhighlight lang="cpp"> double* arr = new double[10]; // 分配10个double的数组 arr[0] = 3.14; // 访问第一个元素 delete[] arr; // 必须使用delete[] </syntaxhighlight> == 高级特性 == === 定位new(Placement new) === 允许在已分配的内存上构造对象: <syntaxhighlight lang="cpp"> #include <new> char buffer[sizeof(int)]; int* p = new (buffer) int(42); // 在buffer位置构造int // 不需要delete,因为是栈内存 </syntaxhighlight> === 异常处理 === 默认情况下,new失败会抛出<code>std::bad_alloc</code>异常: <syntaxhighlight lang="cpp"> try { int* p = new int[10000000000]; } catch (const std::bad_alloc& e) { std::cerr << "内存不足: " << e.what(); } </syntaxhighlight> 可以使用<code>nothrow</code>版本: <syntaxhighlight lang="cpp"> int* p = new(std::nothrow) int[100]; if (!p) { /* 处理分配失败 */ } </syntaxhighlight> == 数学原理 == new操作的时间复杂度通常为O(1),但实际性能取决于内存分配器的实现。连续分配n个对象的空间需求为: <math> \sum_{i=1}^{n} sizeof(T_i) + \text{开销} </math> 其中开销包括内存对齐填充和管理信息。 == 实际应用案例 == === 动态数据结构 === 实现链表节点分配: <syntaxhighlight lang="cpp"> struct Node { int data; Node* next; }; Node* createNode(int value) { Node* newNode = new Node; newNode->data = value; newNode->next = nullptr; return newNode; } </syntaxhighlight> === 工厂模式 === <syntaxhighlight lang="cpp"> class Shape { public: virtual void draw() = 0; static Shape* create(int type); }; Shape* Shape::create(int type) { switch(type) { case 1: return new Circle(); case 2: return new Square(); default: return nullptr; } } </syntaxhighlight> == 最佳实践 == * 总是检查分配是否成功(特别是大型分配) * 每个new必须对应一个delete * 数组使用delete[]释放 * 优先使用智能指针(如<code>std::unique_ptr</code>)管理动态内存 * 避免在频繁调用的代码路径中使用new/delete == 常见问题 == === 内存泄漏 === 忘记释放内存是最常见错误: <syntaxhighlight lang="cpp"> void leak() { int* p = new int(10); // 忘记delete p } // 内存永久丢失 </syntaxhighlight> === 悬垂指针 === <syntaxhighlight lang="cpp"> int* p = new int(5); delete p; *p = 10; // 未定义行为! </syntaxhighlight> == 性能考虑 == new操作涉及系统调用,比栈分配慢得多。典型对比: <mermaid> barChart title 分配速度比较 x-axis 分配方式 y-axis 时间(ns) bar 栈分配: 1 bar new操作: 100 </mermaid> == 与malloc()的区别 == {| class="wikitable" |- ! 特性 !! new !! malloc() |- | 调用构造函数 || ✓ || ✗ |- | 返回类型 || 类型安全指针 || void* |- | 失败处理 || 异常或nothrow || 返回NULL |- | 大小计算 || 自动 || 需手动计算 |} == 扩展阅读 == * C++17引入的带对齐分配的new:<code>align_val_t</code> * 重载类特定的new/delete运算符 * 内存池技术优化频繁分配 {{C++内存管理导航}} [[Category:编程语言]] [[Category:C++]] [[Category:C++ 内存管理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:C++内存管理导航
(
编辑
)