C/C++ delete与delete[]的区别

3

可能是重复的问题:
如何使用new[]和delete导致内存泄漏?
delete与delete[]的区别

我刚开始学习C/C++,被告知要使用delete来删除单个对象,使用delete []来删除数组。

然后我发现了这个网站,它问了这个问题。

Anything wrong with this code?

T *p = new T[10];
delete p;

Note: Incorrect replies: “No, everything is correct”, “Only the first element of the array will be deleted”, “The entire array will be deleted, but only the first element destructor will be called”.

这就引出了一个问题,那么在这段代码块中到底会发生什么呢?我原本以为它会“只删除数组的第一个元素”,但似乎并不是这样。有人可以讲解一下吗?

2
C/C++是两种完全不同的编程语言。由于“new”仅限于C ++,因此删除了C标签。 - David Rodríguez - dribeas
可能的重复问题:https://dev59.com/UXI-5IYBdhLWcg3wVWpi,https://dev59.com/Am025IYBdhLWcg3wLipX - jogojapan
在链接的问题中没有直接提到,但是要知道有多少个对象已经被构造,计数必须存储在分配的块中,通常编译器会注入代码来分配内存、存储整数并返回一个指向缓冲区的 sizeof(size_t) 字符的指针,其中第一个元素被构造。这不适用于 new,因为不需要存储计数。delete(与 new 配对)只需调用析构函数并释放指针中的内存,而 delete [] 必须调用析构函数,并传递一个偏移了 sizeof(size_t) 的指针以释放。 - David Rodríguez - dribeas
因为被释放的指针不是分配的指针,在许多情况下(包括malloc/free),这是违反合约的行为。 - David Rodríguez - dribeas
1个回答

4
  • delete: 这个指令释放了由其操作的指针当前分配的内存。它仅删除指向第一个变量的内存。

  • delete []: 这个指令释放了整个数组所分配的内存。一个数组由几个变量组成,delete只释放了分配给第一个变量的内存,而delete []则全部释放。

一个好的理解方式是将delete视为一条指令,而将delete []视为一个循环;在这个数组中循环并对数组中的每个变量单独调用delete。尽管这不是它实际的工作方式(实际的工作方式要稍微复杂些),但这是一个理解它们之间差异的好方法。

析构函数会被调用到所有对象上,因为在某些情况下,比如一个包含指针的对象数组中,只调用第一个元素的析构函数并不能释放所有内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接