2010-12-11 68 views
1

例如,文章通常会说,如果malloc和delete配对,或者说它是错误的并且不这样做。为什么不编译导致未定义行为的代码错误

但为什么编译器不检查我们。

是否有任何情况下这种代码是正确的和有意的?因此,编译器不能总是说它做错了吗?

或者编译器是否存在技术上的困难?

回答

2

很多原因。离开我的头顶。

  • 某些未定义的行为可能会将已定义的效果定义为实现特定的扩展。

  • 一些未定义的行为仅基于程序的环境或输入发生,因此代码可能会导致未定义的行为,但不一定会这样做。

  • 许多未定义行为的实例很难诊断。可能涉及可能在后续翻译单元中发生冲突的事情。如果他们很容易诊断,那么标准可能需要实施来发布诊断,就像在许多情况下一样。

0

编译器不一定知道指针是否使用new,malloc创建,或者它只是指向堆栈上的某个指针。但是,内存调试器(如valgrind)可以找到这些错误中的一部分。

1

那么,你会怎么说呢?

int* p = (int*)malloc(sizeof(p)); 
foobar(&p); 
delete p; 

foobar是在不同的编译单元中。你不知道它做了什么。

1

在某些情况下,实际上理论上不可能确定malloc是否与删除配对。试想一下halting problem和程序结束时的删除。