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

[知识点]c++ delete与delete[ ]

在C++中,deletedelete[] 是用于释放动态分配的内存的关键字。它们的使用取决于内存是如何分配的。具体来说:

  1. delete 用于释放通过 new 分配的单个对象。
  2. delete[] 用于释放通过 new[] 分配的数组。

如果你通过 new 分配了一个单个对象,那么你必须使用 delete 来释放它。如果你通过 new[] 分配了一个数组,那么你必须使用 delete[] 来释放它。

示例和解释

使用 newdelete

当你分配一个单个对象时,使用 newdelete

#include <iostream>int main() {// 分配一个整数int* p = new int(42);std::cout << "Value: " << *p << std::endl;// 释放分配的内存delete p;return 0;
}

在这种情况下,使用 delete 来释放通过 new 分配的内存。

使用 new[]delete[]

当你分配一个数组时,使用 new[]delete[]

#include <iostream>int main() {// 分配一个包含 10 个整数的数组int* arr = new int[10];// 初始化数组for (int i = 0; i < 10; ++i) {arr[i] = i;std::cout << arr[i] << " ";}std::cout << std::endl;// 释放分配的数组delete[] arr;return 0;
}

在这种情况下,使用 delete[] 来释放通过 new[] 分配的内存。

为什么一定要使用 delete[] 来释放数组

使用 delete 释放通过 new[] 分配的内存会导致未定义行为。这是因为 new[]delete[] 知道它们处理的是一个数组,并会调用每个数组元素的析构函数(如果有)。而 delete 只会调用单个对象的析构函数。

示例:未定义行为

以下示例展示了错误的内存释放方式,这将导致未定义行为:

#include <iostream>int main() {// 分配一个包含 10 个整数的数组int* arr = new int[10];// 错误地使用 delete 而不是 delete[]delete arr;  // 未定义行为return 0;
}

由于 delete 不能正确处理数组的内存释放,这会导致程序崩溃或其他不可预测的行为。

使用智能指针管理内存

现代 C++ 推荐使用智能指针(如 std::unique_ptrstd::shared_ptr)来自动管理内存,避免手动调用 deletedelete[]

#include <iostream>
#include <memory>int main() {// 使用 unique_ptr 自动管理单个对象std::unique_ptr<int> p(new int(42));std::cout << "Value: " << *p << std::endl;// 使用 unique_ptr 自动管理数组std::unique_ptr<int[]> arr(new int[10]);for (int i = 0; i < 10; ++i) {arr[i] = i;std::cout << arr[i] << " ";}std::cout << std::endl;return 0;
} // 在离开作用域时,p 和 arr 会自动释放所管理的内存

智能指针自动管理内存,可以避免内存泄漏和未定义行为问题。

总结

  • 使用 delete 释放通过 new 分配的单个对象
  • 使用 delete[] 释放通过 new[] 分配的数组
  • 错误地使用 delete 来释放数组会导致未定义行为
  • 智能指针(如 std::unique_ptrstd::shared_ptr)可以自动管理内存,减少手动调用 deletedelete[] 的需求
http://www.lryc.cn/news/364005.html

相关文章:

  • iCloud如何被高效利用?
  • 月入30000的软件测试人员,简历是什么样子的?
  • nginx官网源代码方式安装nginx并编译
  • iOS ActivityViewController使用
  • 新手快速上手IDEA【常用快捷键】
  • MySQL里如果有字段是function怎么查询呢?
  • 从高海拔到严寒季的测量作业更要「快准稳」,怎么实现?
  • WowTab:简洁界面,效率神器,重塑新标签页浏览体验
  • PostgreSQL 17 Beta1 发布,酷克数据再次贡献核心力量
  • CDH服务红,查看日志发现host有问题
  • 数据分析------统计学知识点(三)
  • MySQL 导出一条数据的插入语句
  • 隐藏 IP 地址的重要性是什么?
  • Oracle 19c linux安装
  • AI音乐生成流程
  • android room数据库升级脚本常见问题
  • 在 iCloud.com 上导入、导出或打印联系人
  • JavaScript中this方法;var,let,constd区别;JSON是什么
  • Mybatis不明白?就这一篇带你轻松入门
  • pymupdf提取pdf表格及表格数据合并
  • 门外汉一次过软考中级(系统集成项目管理工程师)秘笈,请收藏!
  • [leetcode hot 150]第一百零八题,将有序数组转换为二叉搜索树
  • 科普丨什么是数字孪生灌区(平台)?如何建设?有何好处?
  • Python爬虫如何入门:一步步走向精通的指南
  • Linux用户和用户组的操作
  • git命令行分支(增删改查)
  • 地理加权回归GWR简介
  • 康谋技术 | 自动驾驶:揭秘高精度时间同步技术(一)
  • 客户端被攻击怎么办,为什么应用加速这么适合
  • Introduction to HAL3