与解除分配堆数组相关的语法混淆[重复]

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 array5 整数动态创建内存

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);

【讨论】:

以上是关于与解除分配堆数组相关的语法混淆[重复]的主要内容,如果未能解决你的问题,请参考以下文章

被java语法混淆[重复]

尝试使用 malloc() 分配一个包含内部集合的结构来堆内存 [重复]

如何使用命令行为JAVA分配空间[重复]

混淆 C++ 语言中的字符串重复

重复错误:“不再支持带有花括号的数组和字符串偏移量访问语法”与 phpmyadmin

我需要帮助理解与实体框架上下文的第一种方法相关的 C# 语法 [重复]