我曾偶尔遇到过这种代码 - 我怀疑创建者是/害怕表删除会迭代表和"性价比"(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)
那是内存泄漏.A new []必须与a匹配delete [].此外,由于table是指向指针数组的第一个元素的指针,任何数组成员,如果它是一个数组本身将需要使用a取消分配delete [].
不仅没有任何好处,代码也是完全错误的 - 充其量只会泄漏内存,最糟糕的是,它可能会导致程序崩溃或打开难以找到的安全漏洞.你必须始终与new同delete和new[]同delete[].总是.
这肯定是错误的,因为new []需要与delete []配对.如果不这样做,您将得到未定义的行为.
它可能(部分)工作,因为大多数实现使用new来实现new [].这种实现的唯一区别是它只会调用1个析构函数(对于第一个元素而不是所有析构函数.但是要避免它,因为它不是合法的c ++.
确实没有理由这样写,也没有理由从不这样做。
的确,对于具有琐碎析构函数的类型(如您的情况下的原始指针),不需要知道数组中元素的实际数量,因此编译器可能会决定将new []和delete []映射到new上,并删除来减少开销。如果它决定这种方式,那么您就必须在不采取额外步骤的情况下停止它,因此该编译器优化将在没有您通知的情况下进行,并且是免费的。
同时,某些使用您的代码的人可能希望重载全局运算符new和delete(以及new []和delete [])。如果发生这种情况,您会遇到麻烦,因为这是您真正需要delete和delete []之间的区别的时候。
除此之外,依赖于编译器的优化是不可移植的。
所以这种情况下,当你没有任何好处取代删除[]与删除,但风险大的时候靠到未定义的行为。
| 归档时间: |
|
| 查看次数: |
1521 次 |
| 最近记录: |