为什么C++仍然有delete []和delete运算符?

unj*_*nj2 5 c++ arrays syntax memory-management

使用单个关键字实现删除数组难吗?效率低下吗?

R. *_*des 16

首先,让我总结两者的作用:delete一个对象调用析构函数并释放内存; delete[]调用一些对象的析构函数并释放内存.

可以将它们折叠到同一个操作中:"调用一些对象的析构函数并释放内存." 毕竟一个一些数字.

双方deletedelete[]在指针操作.像这个:

foo* ptr;
Run Code Online (Sandbox Code Playgroud)

仔细看看.并告诉我当我们应该调用多少析构函数delete.你不能.所以不能编译器.这只能在运行时知道.有关对象数量的信息必须存储在某处.这意味着,对于每次使用new[],都会分配一些额外的内存来跟踪该数字.

C++建立在"你不为你不使用的东西付费"的原则之上,这就是非数组形式存在的原因:因为delete总是只删除一个对象,new不需要分配任何额外的.

  • @ user315052否.即使是这种情况,`malloc`存储的信息也是错误的信息.它是在某个块中分配的*存储量*,它通常与某个特殊边界对齐,因此可能超过在那里构造的对象的实际大小.但是,`delete []`需要的是*对象数*,而不是为它们分配的存储空间大小.`malloc`不存储,因为这与C无关:没有析构函数. (4认同)
  • @ R.MartinhoFernandes:如果扩展C库以报告为指针分配了多少内存,那么C++可以很容易地让`delete`表现得像`delete []`,问候. (3认同)
  • Malloc知道为分配请求分配了多少内存.`delete`本可以查阅相同的信息. (2认同)

Dav*_*eas 6

问题不是复杂性,而是参数为delete单个指针的事实,无论您是分配单个元素还是数组,该类型都完全相同.实现之下是完全不同的,因为销毁的元素数量不同.

这实际上是与C向后兼容的一个问题...如果从一开始就没有要求我们可能没有C++(它不会赶上这么多)但是类型new T[N]可能与类型不同的new T,并且可以使用的类型系统,以检测delete需要被调用.

  • @OliCharlesworth正如我在回答中所说:"新T [1]`有额外的开销,你不应该为你不使用的东西买单. (2认同)

Jam*_*nze 5

这是因为C++设计的首要原则之一就是你不为你不使用的东西买单. new[]/ delete[]有额外的成本,并且有人认为他们的实用程序(我从未在25年的C++中使用过.)的限制足够有限,以至于没有理由将此成本添加到非数组new/ delete.


Nik*_*sov -3

如果像这样的功能很容易实现,就不能从语言事件中删除。在这样的更改之后,您是否自愿来修复我的所有代码?