一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
请看下面的程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#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++Builder动态对象数组:TList类、DynamicArray与STL中的Vector容器 #### TList 类 在C++Builder中,TList是用于管理动态对象数组的一种方式。它提供了较为简便的方式来创建、管理和销毁一系列对象。TList...
在C++编程语言中,数组是一种基本的数据结构,分为静态数组和动态数组两种类型。静态数组和动态数组在使用上有显著的区别,这些差异主要体现在内存分配、大小确定、生命周期以及内存管理等方面。 首先,静态数组在...
首先,要创建一个动态数组,通常有两种方法:使用指针和使用new关键字动态分配内存,以及利用C++标准库中的vector容器。指针和new关键字的方法通过动态分配内存来实现,这种方法需要程序员手动管理内存,包括分配...
有时,我们可能需要在程序运行时动态创建和销毁控件数组。这可以通过调用 `CreateWindow` 或 `CreateWindowEx` 函数来完成。销毁控件时,使用 `DestroyWindow` 函数逐个删除数组中的控件,然后释放控件数组。 ### ...
在C++中,可以通过`new`和`delete`操作符来实现动态数组的创建和销毁。 ##### 2. 动态数组的创建与初始化 本案例中使用了动态数组来存储点云数据。首先定义了一个二维动态数组`double **data`来存储每个点的坐标。...
在C++编程中,模板是一种强大的工具,它允许我们创建泛型代码,即代码可以处理多种数据类型。这里我们将深入探讨如何使用C++模板来实现一个双下标重载的Matrix类,这是一个常见的数学概念,通常用于表示二维矩阵。 ...
"c++结构体数组学生成绩管理系统" 本系统采用c++语言,使用结构体数组来存储学生的信息,包括姓名、学号、语文、数学和英语的成绩,以及总分和平均分。系统提供了添加、显示、排序和统计等功能,能够对学生的成绩...
### 编程技术C++数组指针与字符串 #### 数组基础 - **数组概念**: - 数组是一种线性结构,它是由相同类型的多个元素组成的有序集合。 - 数组中的每个元素都可以通过一个索引(或下标)来访问。 - 数组在内存中...
`new`是C++中的动态内存分配运算符,它用于在堆上为对象分配内存。当调用`new T`时,会返回一个指向新创建的`T`类型对象的指针。对于数组,`new[]`可以用来分配一系列相同类型的对象。例如,`new int[5]`将分配一个...
线程池可以预先初始化一定数量的线程,等待分配任务,这样可以避免频繁创建和销毁线程的开销。 在“mfcproc”这个压缩包文件中,可能包含了一个使用Microsoft Foundation Classes (MFC)库实现的多线程示例。MFC是...
在C++中,我们可以使用`new`运算符动态分配内存来创建一个数组。例如,如果我们想要创建一个可以容纳10个整数的顺序表,可以这样做: ```cpp int* seqList = new int[10]; ``` 这将创建一个大小为10的整数数组。...
总结来说,C++ 中让函数返回“数组”的方法通常是通过返回指向动态分配内存的指针,或者通过传入数组指针参数,由函数直接修改调用者提供的数组。这两种方法都需要对指针和内存管理有深入理解,以避免可能出现的错误...
这篇博客主要探讨了如何在MFC程序中动态创建`CEdit`控件,并使其在用户按下回车键时自动销毁。`CEdit`是MFC中的编辑框控件,常用于接收用户的文本输入。 首先,我们需要理解MFC中的动态创建机制。与静态创建控件...
动态内存分配(如使用`new`操作符)允许我们在程序运行时根据需要动态地创建和销毁内存。深拷贝和浅拷贝是关于对象复制的重要概念,涉及到内存的复制以及何时复制底层数据。字符串在C++中可以视为字符数组,可以使用...
在main函数中,我们创建了一个链队列Q,然后将数组A[]中的元素赋给链队列Q,并将链队列Q输出,然后删除链队列Q的队头元素,并将链队列Q输出,最后销毁链队列Q。 链队列的基本操作包括创建、销毁、查找、删除、插入...
4. **动态数组**:C++标准库提供`std::vector`容器,它是一种动态数组,可以在运行时调整大小。`vector`可以方便地实现线性表的插入和删除操作,而无需担心固定大小的限制。 5. **内存管理**:使用数组实现线性表时...
c-vector项目的核心思想是使用指针和动态内存分配(如`malloc`、`realloc`、`free`)来创建一个可以动态扩展和收缩的数组。下面我们将详细探讨这个实现过程: 1. **数据结构设计**:首先,我们需要一个数据结构来...
然而,"cpp的动态数组"通常指的是使用C++中的`std::vector`或原始的C风格动态数组(通过`new`操作符创建)。这两种方式都允许在运行时动态调整数组的大小,这与C++标准库中的`array`有所不同,因为`array`的大小在...
上述代码中的`getRandom`函数创建了一个静态数组`r`,即使在函数结束时也不会被销毁,因此可以安全地返回其地址。 3. 随机数生成函数示例: 下面是一个完整的示例,展示如何从函数返回一个包含10个随机数的数组:...