为什么不能在数组的方括号之间使用值? 我理解在现代C++编译器中,用新[]/CODE分配的数组的长度被秘密地存储(通常在数组后面),因此当 DELTE> []/CODE被调用时,编译器知道数组长度,但是为什么我们不能完全放弃它,而是给它使用删除[n]的选项。释放内存 因为C++支持了你不为不使用的东西付费的想法,而且通常知道一个数组的长度是个好主意,我不明白为什么这个特性被删除了。 < P>逻辑上,移除这种特征最常见的原因是它不需要,或者允许它增加了错误程序行为的可能性

为什么不能在数组的方括号之间使用值? 我理解在现代C++编译器中,用新[]/CODE分配的数组的长度被秘密地存储(通常在数组后面),因此当 DELTE> []/CODE被调用时,编译器知道数组长度,但是为什么我们不能完全放弃它,而是给它使用删除[n]的选项。释放内存 因为C++支持了你不为不使用的东西付费的想法,而且通常知道一个数组的长度是个好主意,我不明白为什么这个特性被删除了。 < P>逻辑上,移除这种特征最常见的原因是它不需要,或者允许它增加了错误程序行为的可能性,c++,C++,然而,这种合乎逻辑的解释掩盖了很多细节,我将在这里尝试讨论这些细节 要使delete[]表达式在没有未定义行为的情况下工作,它需要能够访问在相应的new[]表达式中分配的内容的实际长度。如果不这样做,它就不能为动态分配的数组的每个元素调用析构函数(假设元素是具有析构函数的类类型) 让我们首先假设new[]的工作以一种(我在这里用你的话)“秘密”(即特定于实现)的方式将分配的长度存储在内存中。这意味着不需要使用delete[]表达式来提供长度-不管怎样,实现都可以访问正确的值并使用它。如果dele

然而,这种合乎逻辑的解释掩盖了很多细节,我将在这里尝试讨论这些细节

要使
delete[]
表达式在没有未定义行为的情况下工作,它需要能够访问在相应的
new[]
表达式中分配的内容的实际长度。如果不这样做,它就不能为动态分配的数组的每个元素调用析构函数(假设元素是具有析构函数的类类型)

让我们首先假设
new[]
的工作以一种(我在这里用你的话)“秘密”(即特定于实现)的方式将分配的长度存储在内存中。这意味着不需要使用
delete[]
表达式来提供长度-不管怎样,实现都可以访问正确的值并使用它。如果
delete[]
表达式要提供长度,则实现可以忽略它(因为它仍然可以访问正确的值)或检查它。实际上,检查它没有什么意义-如果提供的值不正确,实现可以报告它(例如,将消息写入
std::cerr
,调用
abort()
)或忽略它(即使用正确的值)。无论哪种方式,检查
delete[]
表达式中提供的长度都没有什么价值

或者,假设实现没有以“秘密”方式存储分配的长度。然后有两种可能性-提供的长度要么正确,要么不正确。如果提供的长度正确,则
delete[]
表达式按预期工作(正确的析构函数调用数组元素的次数,向主机系统释放正确的内存量等)。如果提供的长度不正确,则结果是未定义的行为(实现无法检测到问题,更不用说纠正问题并使用正确的长度)

现在,标准应该做什么?这三种可能是要求
delete[]
表达式提供长度,允许表达式提供长度(即使其成为可选的),或不允许提供长度

如果要求
delete[]
表达式提供长度,则如果
delete[]
表达式提供的长度不正确,则无法指定除未定义行为以外的任何内容。毕竟,有些实现会将正确的长度存储在一个“秘密”位置(因此它们可以忽略提供的长度),而另一些实现则无法检查值是否正确(即,如果
delete[]
表达式提供了错误的长度,它们将无法恢复)。开发人员将依赖于实现质量问题来获得可靠的行为——从一些实现中获得,而不是从其他实现中获得

如果允许
delete[]
表达式(可选)提供长度,则实现需要将正确的长度存储在“机密”位置,以便在
delete[]
表达式未提供长度时确保正确运行。实际上,大多数实现都会忽略提供的长度,并且不需要
delete[]
表达式来提供它。然而,开发人员和语言律师都是书呆子,对于是否应该在
delete[]
表达式中提供长度,长度是否需要正确,以及结论是否正确,会有很多争论,这无关紧要。这样的争论可能对学究来说是令人愉快的,但是对于C++初学者来说,这将是一个困惑的来源。

最后一种可能是禁止提供长度的
delete[]
表达式。这会要求实现将长度存储在“秘密”位置。
delete[]
表达式的工作将访问长度,并按预期工作

因此,上述三种可能性相当于不必要地允许未定义的行为,导致开发人员之间关于做什么或不做什么的非生产性辩论,或者如果给定了有效指针,
delete[]
表达式始终正常工作(其中有效指针指从
new[]获得的指针)
表达式,不会被删除两次,等等)

最后一个选项—不允许在
delete[]
表达式中提供长度—最符合逻辑。这恰好是标准规定的


唯一的折衷办法是一些人查看历史记录(较旧的规范确实要求在
delete[]
表达式中提供长度)并要求解释。。。这将消耗带宽或脑力来回答问题。就像这里发生的那样。但是,世界从来都不是完美的,所以我们都是这样生活的。

你是说像
delete[15]arrname
这样的词是一个有效的、不受欢迎的表达方式吗?当你可以使用
std::vector
时,为什么还要使用
new[]
delete[]