网站首页 > 技术文章 正文
记得有次面试被问到了delete与delete[]的区别?当时回答的也不好下面来总结下它们的区别。c++告诉我们在回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。
关于new[]和delete[]其中又分为两种情况:
1.为基本数据类型分配和回收空间。
2.为自定义类型分配和回收空间。
下面看程序
#include<iostream>
using namespace std;
class T
{
public:
T() { cout << "T 构造函数" << endl; }
~T() { cout << "T 析构函数" << endl; }
};
int main()
{
const int NUM = 3;
T* p1 = new T[NUM];
cout << hex << p1 << endl;
delete p1;
T* p2 = new T[NUM];
cout << p2 << endl;
delete[] p2;
return 0;
}
大家可以自己运行这个程序,看一看delete p1与delete [] p1的不同结果。
1.从运行结果中我们可以看出,delete p1在回收空间的过程中,只有p1[0]这个对象调用了析构函数,其它对象如p1[1] p1[2]等都没有调用自身的析构函数,这就是问题的本质所在,如果用delete []则在回收空间之前,所有对象都会首先调用自己的析构函数。
2.基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用delete和delete[]都是应该可以的,但是对于类对象数组,只能用delete[], 对于new的单个对象只能用delete不能用delete []回收空间。
3.所以一个简单的使用规则是:new和delete new[]与delete[]对应使用
4.可以看出如果只是使用了delete来进行释放对象数组,则会出现进程异常且析构函数只调用了一次。
5.如果换成delete[]可以看出释放对象数组时,调用了三次析构函数。
- 上一篇: C++基础知识总结(超详细总结)
- 下一篇: C++内存分配与释放
猜你喜欢
- 2024-12-06 2024年C++编程不再推荐使用的功能你还在在用吗?
- 2024-12-06 C++ memcpy的用法,大数据传输与获取
- 2024-12-06 C++中继承的详细介绍以及多态的使用场景
- 2024-12-06 C++“智能指针”并不智能,因为它也不总是知道内存是如何分配的
- 2024-12-06 C++11精要学习:右值引用与完美转发
- 2024-12-06 C/C++编程笔记:详细讲解丨复制构造函数
- 2024-12-06 C++ map用法总结
- 2024-12-06 C#与C++交互开发系列(四):使用C++/CLI进行互操作
- 2024-12-06 C++的map用法
- 2024-12-06 C++基础语法梳理:内存分配和管理
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)