使用单个关键字实现数组删除难吗?它的效率是否降低?
使用单个关键字实现数组删除难吗?它的效率是否降低?
首先,让我总结一下它们的作用: delete
调用一个对象的析构函数并释放内存;delete[]
调用一些对象的析构函数并释放内存。
可以将它们合并为同一个操作:“调用一些对象的析构函数并释放内存”。毕竟,one 也是 some 中的一种。
无论是 delete
还是 delete[]
都在指针上进行操作,就像这个:
foo* ptr;
仔细看看它,告诉我当我们delete
它时应该调用多少析构函数。你无法知道,编译器也一样。这只能在运行时确定。关于对象数量的信息必须被存储在某个地方。这意味着,对于每个new[]
的使用,都会分配一些额外的内存来跟踪该数量。
C++建立在“不付费用”的原则之上,这就是为什么非数组形式存在的原因:由于delete
始终仅删除一个对象,new
不需要分配任何额外空间。
delete(1, ptr)
和 delete(expression, ptr);
是微不足道的。每个人都知道他们有多少元素。 - Puppydelete
可以查询相同的信息。 - jxhdelete
的行为像delete[]
,问候。 - jxhmalloc
存储的信息也是错误的。它所存储的是在某个块中分配的存储量,通常按某些特殊边界对齐,因此可能大于在那里构造的对象的实际大小。但是,delete[]
需要的是对象数量,而不是为它们分配的存储空间的大小。在 C 语言中这并不相关,因为没有析构函数。 - R. Martinho Fernandeschar
或 double
,你可以分配一百万个,然后返回指针,带有计数器为 10,因为那是你实际读取的数量。 - James Kanzedelete
的参数是单个指针,而且无论您分配单个元素还是数组,该类型都完全相同。在底层实现方面存在很大的差异,因为销毁的元素数量不同。new T[N]
的类型可能与new T
的类型不同,并且可以使用类型系统来检测需要调用哪个delete
。new T
和 new T[1]
有什么不同。 - Oliver Charlesworthnew T[1]
有额外的开销,你不应该为你不使用的东西付费。 - James Kanze这是因为C++设计的一个重要原则是,不使用的部分不需要支付额外的代价。new[]
/delete[]
有额外的成本,并且人们认为它们的实用性(我在25年的C++编程中从未使用过它们)非常有限,不足以证明将此成本添加到非数组new
/delete
中。
即使实现起来很容易,也不能从语言中轻易删除此类功能。在进行这样的更改后,你们愿意自愿前来修复我的代码吗?
delete[]
语法已经过时但仍然可以使用,他们本来可以将其废弃而不必删除它,并使符合规范的实现将一个委托给另一个。 - Mark Ransomauto_ptr
没有遇到任何问题。 - John Diblingauto_ptr
是一个库类,而不是语言结构,因此它并不相同。如果你问我,强制实施这种复杂的有用特性是完全愚蠢的。 - Nikolai Fetissov