C++中delete和delete[]的区别

本文探讨了C++中new和delete操作符的正确使用方式,特别是new[]和delete[]在数组对象上的应用区别。通过具体示例展示了不同情况下如何避免内存泄漏及对象析构的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 
请看下面的程序:
#include <iostream>;

using namespace std;



class T {

public:

  T() { cout << "constructor" << endl; }

  ~T() { cout << "destructor" << endl; }

};



int main()

{

  const int NUM = 3;



  T* p1 = new T[NUM];

  cout << hex << p1 << endl;

  //  delete[] p1;

  delete p1;



  T* p2 = new T[NUM];

  cout << p2 << endl;

  delete[] p2;

}

大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。 
从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。 
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 
所以一个简单的使用原则就是:new 和 delete、new[] 和 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; } ``` 上述例子展示了如何恰当利用这两个关键字完成各自的任务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值