关于C++中,delete 和delete []的区别

本文探讨了C++中delete与delete[]操作符的使用区别。对于基本数据类型的数组,两者的效果相同;但对于类的对象数组,delete[]会调用每个对象的析构函数,而delete则不会。正确使用这两个操作符对于资源管理和避免内存泄漏至关重要。

我猜,肯定有人认为一个是对变量的内存空间进行释放,一个是对数组的内存空间进行释放。
其实根本不是这样,比如我有一个数组

int a[10];

delete a;
delete [] a;

这两个delete其实可以达到一样的效果。但是当数组是一个类的数组的时候,情况就不一样了,delete不会调用类对象的析构函数,而delete [] 会调用类对象的析构函数。

### C++ 中 `delete` `delete[]` 的区别C++ 编程语言中,动态内存分配是一个重要的概念。为了有效地管理释放这些资源,C++ 提供了两个操作符:`delete` `delete[]`。 #### 单一对象的删除 (`delete`) 当通过 `new` 关键字为单一对象分配内存时,应使用 `delete` 来释放该内存。这不仅会释放分配给对象的空间,还会调用对象的析构函数来执行清理工作[^3]。如果尝试使用 `free()` 而不是 `delete`,则不会触发析构函数的行为,从而可能导致未定义行为或资源泄漏。 ```cpp MyClass* obj = new MyClass(); // 使用obj... delete obj; // 正确方式,调用了析构函数并释放内存 ``` #### 数组对象的删除 (`delete[]`) 对于通过 `new[]` 创建的对象数组而言,则需采用 `delete[]` 形式来进行销毁。这是因为每一个单独元素都需要被适当地解构;即每项都必须经历一次对应的析构过程以确保所有成员变量得到妥善处理[^5]。如果没有指定 `[ ]` 符号仅运用普通的 `delete` ,程序可能无法正确地遍历整个数组并对每个实例分别应用各自的终止逻辑,进而引发潜在错误甚至崩溃风险。 ```cpp MyClass* arr = new MyClass[10]; // 使用arr... delete[] arr; // 正确方式,逐个调用每个元素的析构函数后再释放整体存储区域 ``` 值得注意的是,在现代C++实践中推荐尽可能依赖智能指针(如unique_ptr 或 shared_ptr)以及容器类(像std::vector),它们能够自动管理生命周期内的资源回收问题,减少手动干预带来的失误几率。 ### 总结对比表 | 特性 | `delete` | `delete[]` | |--------------------|-----------------------------------|------------------------------------| | **适用场景** | 单独对象 | 对象数组 | | **析构调用次数** | 一次 | 等于数组长度 | 以上就是关于两者之间主要差异性的阐述说明。 ```cpp #include <iostream> using namespace std; class Test { public: ~Test(){ cout << "Destructor called\n"; } }; int main () { Test *singleObj = new Test; delete singleObj; Test *arrayOfObjs = new Test[3]; delete [] arrayOfObjs; return 0; } ``` 上述例子展示了如何恰当利用这两个关键字完成各自的任务需求。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值