假设我们有来自C ++ 98的遗留代码:
bool expensiveCheck();
struct Foo;
bool someFunc()
{
Foo *ptr = 0;
if( expensiveCheck() )
ptr = new Foo;
// doing something irrelevant here
...
if( ptr ) {
// using foo
}
delete ptr;
return ptr; // here we have UB(Undefined Behavior) in C++11
}
所以基本上这里的指针用于保持动态分配的数据并同时将其用作标志。对我来说它是可读代码,我相信它是合法的C ++ 98代码。现在根据这个问题:
What happens to the pointer itself after delete?
此代码在C ++ 11中具有UB。这是真的吗?
如果是,请记住另一个问题,我听说委员会付出了巨大努力,不破坏新标准中的现有代码。如果我在这种情况下没有弄错,这不是真的。是什么原因?这样的代码是否已经被认为是有害的,所以没有人关心它会被打破?他们没有考虑后果?这种优化是如此重要?还有别的吗?
答案 0 :(得分:6)
您的示例也展示了C ++ 98下的未定义行为。从C ++ 98标准:
[basic.stc.dynamic.deallocation] / 4 如果给标准库中的释放函数赋予的参数是一个不是空指针值的指针(4.10),则释放函数应取消分配指针引用的存储,使所有指针无效,引用解除分配的存储的任何部分。使用无效指针值(包括将其传递给释放函数)的效果是未定义的.3)
脚注33)在某些实现中,它会导致系统生成的运行时故障。