与解除分配堆数组相关的语法混淆

时间:2018-01-30 16:10:28

标签: c++ memory-leaks heap-memory

当我们释放数组占用的堆内存时,我对语法有点混淆

int *p = new int[5];

现在要解除分配,以下哪一项是正确的:

delete p;

OR

delete[ ] p;

后者似乎更正确。但它让我困惑,我不明白它怎么会知道阵列存在多少内存。我的意思是,我们只给它一个数组的起始地址(通过p)。因此,从起始地址开始,编译器将如何知道它到哪里必须解除分配,以及何时停止释放。

2 个答案:

答案 0 :(得分:1)

你的第二种语法是正确的,并且编译器知道数组的大小,因为它在分配数组时注意到它。这通常存储在你为数组分配的内存之前的一块内存中。这样,当释放内存时,解除分配器通过检查这个内存确切地知道要释放多少内存。

答案 1 :(得分:0)

在下面的语句中,您将为int array 5整数

动态创建内存
int *p = new int[5]; 

它看起来像下面

 p = operator new [] (20); /** p points to first 20 bytes from starting address **/

要免费或取消分配p,您应该使用

delete [] p;

看起来像下面

operator delete [] (p); /* It free frees memory of 20 bytes from where p is pointing */

注意:如果仅使用delete p,那么它将不会释放整个20个字节。 delete p内部转换为operator delete (p);