跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ delete 运算符
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目讲解C++中用于释放动态内存的`delete`运算符,建议先掌握[[new运算符]]和[[指针]]相关知识}} = C++ delete运算符 = '''delete运算符'''是C++中用于释放动态分配内存的关键运算符,与`new`运算符配合使用。当使用`new`创建的对象不再需要时,必须使用`delete`释放内存以避免内存泄漏。 == 基本语法 == delete运算符有两种形式: 1. 释放单个对象: <syntaxhighlight lang="cpp"> delete pointer; </syntaxhighlight> 2. 释放对象数组: <syntaxhighlight lang="cpp"> delete[] array_pointer; </syntaxhighlight> == 工作原理 == 当调用`delete`时: # 调用对象的析构函数(如果存在) # 释放对象占用的内存 # 将指针标记为无效(但不会自动设为`nullptr`) <mermaid> graph TD A[调用delete] --> B[执行析构函数] B --> C[释放内存] C --> D[指针变为悬垂指针] </mermaid> == 基础示例 == === 单个对象删除 === <syntaxhighlight lang="cpp"> #include <iostream> class MyClass { public: MyClass() { std::cout << "构造函数调用\n"; } ~MyClass() { std::cout << "析构函数调用\n"; } }; int main() { MyClass* ptr = new MyClass(); // 动态分配 delete ptr; // 释放内存 return 0; } </syntaxhighlight> 输出: <pre> 构造函数调用 析构函数调用 </pre> === 数组删除 === 必须使用`delete[]`释放数组: <syntaxhighlight lang="cpp"> int main() { int* arr = new int[10]; // 分配10个整数的数组 delete[] arr; // 正确释放方式 return 0; } </syntaxhighlight> == 常见错误与注意事项 == === 错误1:错误配对 === <syntaxhighlight lang="cpp"> int* p = new int; delete[] p; // 未定义行为! int* arr = new int[10]; delete arr; // 未定义行为! </syntaxhighlight> === 错误2:重复删除 === <syntaxhighlight lang="cpp"> int* p = new int; delete p; delete p; // 程序崩溃! </syntaxhighlight> === 最佳实践 === 1. 删除后立即将指针设为`nullptr`: <syntaxhighlight lang="cpp"> delete ptr; ptr = nullptr; </syntaxhighlight> 2. 使用RAII(资源获取即初始化)技术替代裸`new`/`delete`: <syntaxhighlight lang="cpp"> #include <memory> std::unique_ptr<int> smartPtr(new int(42)); // 不需要手动delete </syntaxhighlight> == 高级主题 == === 自定义删除器 === C++允许为智能指针指定自定义删除器: <syntaxhighlight lang="cpp"> void customDeleter(int* p) { std::cout << "自定义删除\n"; delete p; } std::unique_ptr<int, decltype(&customDeleter)> ptr(new int, customDeleter); </syntaxhighlight> === 重载delete运算符 === 可以重载类特定的`delete`运算符: <syntaxhighlight lang="cpp"> class MyClass { public: static void operator delete(void* ptr) { std::cout << "自定义delete\n"; ::operator delete(ptr); } }; </syntaxhighlight> == 数学表示 == 内存释放过程可以表示为: <math> \text{delete} : \text{Pointer} \times \text{Heap} \rightarrow \text{Heap}' </math> 其中Heap' = Heap - allocated_block(pointer) == 实际应用案例 == === 游戏开发中的资源管理 === <syntaxhighlight lang="cpp"> class Texture { unsigned char* data; public: Texture(size_t size) { data = new unsigned char[size]; } ~Texture() { delete[] data; } // ...其他方法... }; void loadLevel() { Texture* levelTexture = new Texture(1024*1024); // 使用纹理... delete levelTexture; // 关卡卸载时释放 } </syntaxhighlight> == 性能考虑 == 1. `delete`操作的时间复杂度通常是O(1),但可能触发操作系统级的内存回收 2. 频繁的`new`/`delete`会导致内存碎片 3. 内存池技术可以优化频繁的小对象分配/释放 {{Warning|切勿删除以下内存: * 栈分配的对象(`int x; delete &x;`) * 已经删除的指针 * 空指针(`delete nullptr;`是安全的) * 通过`malloc()`分配的内存(应使用`free()`)}} [[Category:编程语言]] [[Category:C++]] [[Category:C++ 内存管理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)