【发布时间】:2013-04-25 11:16:30
【问题描述】:
我找到了一段带有 UB 的代码,并被告知将其保留在代码中,并附有说明它是 UB 的注释。仅使用 MSVC2012。
代码本身有一个 Foo 对象的原始数组,然后将该数组转换为带有 reinterpret_cast<char*> 的 char*,然后在其上调用 delete casted_array(像这样,而不是 delete[])。
像这样:
Foo* foos = new Foo[500];
char* CastedFoos = reinterpret_cast<char*>(foos);
delete CastedFoos;
根据标准 5.3.5/3,这显然是未定义的行为。
显然,这段代码的作用是避免调用析构函数作为优化。
我想知道,实际上是否存在将 UB 留在代码中的地方可以被视为有效?
另外,就我而言,将上述内容留在代码中并不聪明,对吗?
【问题讨论】:
-
从技术上讲,UB 是一个 UB。一个特定的实现可能会展示一种 UB 类型的特定重复行为,但这并不能保证该行为不可移植。
-
几乎所有特定于实现的扩展都是标准 C++ 中未定义的行为,使用扩展肯定有正当理由。
-
别管这个问题,但为什么这是必要的?如果
Foo没有任何有用的可破坏的东西,只需给它一个微不足道的析构函数。如果确实如此,并且您接受了泄漏,那么为什么还要费心释放内存呢? -
我想将
~Foo()更改为什么都不做太有意义了,而::operator delete(foos)太简单了? ;-) -
无论如何,我更喜欢放置新对象创建。然后就可以适当的释放内存了,是否是UB“受限于”相关的析构函数有没有作用。 (但当然是循环和never via array-placement-new。)