我偶尔会遇到这样的代码-我怀疑创建者害怕表删除会在表上迭代和“性价比”(这两种方式都不会实现)……在这里不使用表delete有什么实际的好处吗?
myClass** table = new myClass* [size];
... //some code that does not reallocate or change the value of the table pointer ;)
delete table; // no [] intentionally
发布于 2009-04-27 12:59:11
真的没有理由这样写,而且有一个严肃的理由永远不要这样做。
确实,对于带有简单析构函数的类型(如本例中的原始指针),不需要知道数组中元素的实际数量,因此编译器可能会决定将new[]和delete[]映射到new和delete,以减少开销。如果它以这种方式决定,你不能在不采取额外步骤的情况下停止它,所以这个编译器优化将在没有你的通知的情况下发生,并且是免费的。
同时,使用您的代码的人可能希望重载全局操作符new和delete (以及new[]和delete[] )。如果发生这种情况,您会遇到大麻烦,因为此时您可能真的需要delete[]和delete之间的区别。
此外,这种依赖于编译器的优化是不可移植的。
因此,当你用delete替换delete[]没有任何好处,但却冒着大量依赖于未定义行为的风险时,情况就是这样。
发布于 2009-04-24 20:19:02
如果你这样做,你将得到C++标准所说的未定义的行为--任何事情都可能发生。
发布于 2009-04-24 20:18:45
这是一个内存泄漏。delete []
必须与new []
匹配。此外,由于table
是指向指针数组的第一个元素的指针,因此需要使用delete []
释放任何数组成员,如果它本身是一个数组。
https://stackoverflow.com/questions/787417
复制相似问题