当我们释放数组占用的堆内存时,我对语法有点混淆
int *p = new int[5];
现在要解除分配,以下哪一项是正确的:
delete p;
OR
delete[ ] p;
后者似乎更正确。但它让我困惑,我不明白它怎么会知道阵列存在多少内存。我的意思是,我们只给它一个数组的起始地址(通过p)。因此,从起始地址开始,编译器将如何知道它到哪里必须解除分配,以及何时停止释放。
答案 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);