与解除分配堆数组相关的语法混淆[重复]
Posted
技术标签:
【中文标题】与解除分配堆数组相关的语法混淆[重复]【英文标题】:Confusion in syntax related to Deallocating Heap Arrays [duplicate] 【发布时间】:2018-07-09 14:24:28 【问题描述】:当我们释放数组占用的堆内存时,我对语法有点困惑
int *p = new int[5];
现在进行解除分配,以下哪一项是正确的:
delete p;
或
delete[ ] p;
后者似乎更正确。但这让我很困惑,我不明白它怎么知道数组存在多少内存。我的意思是,我们只给它数组的起始地址(通过 p)。那么,从起始地址开始,编译器如何知道它必须在哪里释放,以及何时停止释放。
【问题讨论】:
也许你把int *p = new int[5];
和std::vector<int> p(5);
混淆了:P
【参考方案1】:
您的第二种语法是正确的,并且编译器知道数组的大小,因为它在您分配数组时会注意到它。这通常存储在您为数组分配的内存之前的一块内存中。这样,当需要释放内存时,释放器通过检查此内存来准确知道要释放多少内存。
【讨论】:
所以,即使我创建了多个堆数组,编译器也知道每个堆数组的大小,我不应该在解除分配时担心它,对吧? 是的,完全正确。 有趣的问题是为什么需要不同的语法。如果编译器可以记住这是一个包含 n 个成员的数组,为什么它不记得这是一个标量与数组new
@pm100 如果通过库获取指针,编译器不知道它是使用new[]
创建的。在运行时检查是有代价的,而 C++ 的口号是“不要为不使用的东西付费”。 :)【参考方案2】:
在下面的语句中,您正在为 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);
【讨论】:
以上是关于与解除分配堆数组相关的语法混淆[重复]的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 malloc() 分配一个包含内部集合的结构来堆内存 [重复]