你为什么要写这样的东西?(故意不在数组上使用delete [])

RnR*_*RnR 7 c++ coding-style

我曾偶尔遇到过这种代码 - 我怀疑创建者是/害怕表删除会迭代表和"性价比"(imho不会以任何方式完成)......有没有真正的从不使用表删除这里可能得到/考虑/想象的好处?

myClass** table = new myClass* [size];
... //some code that does not reallocate or change the value of the table pointer ;)
delete table; // no [] intentionally
Run Code Online (Sandbox Code Playgroud)

小智 19

如果你这样做,你将得到C++标准调用未定义行为的东西 - 任何事情都可能发生.


dir*_*tly 8

那是内存泄漏.A new []必须与a匹配delete [].此外,由于table是指向指针数组的第一个元素的指针,任何数组成员,如果它是一个数组本身将需要使用a取消分配delete [].

  • 它不符合黑客的资格.这是完全错误的. (5认同)
  • @RnR:这完全取决于实现......当然并非总是如此. (3认同)

Ada*_*eld 8

不仅没有任何好处,代码也是完全错误的 - 充其量只会泄漏内存,最糟糕的是,它可能会导致程序崩溃或打开难以找到的安全漏洞.你必须始终与newdeletenew[]delete[].总是.


lot*_*har 5

这肯定是错误的,因为new []需要与delete []配对.如果不这样做,您将得到未定义的行为.

它可能(部分)工作,因为大多数实现使用new来实现new [].这种实现的唯一区别是它只会调用1个析构函数(对于第一个元素而不是所有析构函数.但是要避免它,因为它不是合法的c ++.


sha*_*oth 5

确实没有理由这样写,也没有理由从不这样做。

的确,对于具有琐碎析构函数的类型(如您的情况下的原始指针),不需要知道数组中元素的实际数量,因此编译器可能会决定将new []delete []映射到new上,删除来减少开销。如果它决定这种方式,那么您就必须在不采取额外步骤的情况下停止它,因此该编译器优化将在没有您通知的情况下进行,并且是免费的。

同时,某些使用您的代码的人可能希望重载全局运算符newdelete(以及new []delete [])。如果发生这种情况,您会遇到麻烦,因为这是您真正需要deletedelete []之间的区别的时候。

除此之外,依赖于编译器的优化是不可移植的。

所以这种情况下,当你没有任何好处取代删除[]删除,但风险大的时候靠到未定义的行为。