例如,文章通常会说,如果malloc和delete配对,或者说它是错误的并且不这样做。为什么不编译导致未定义行为的代码错误
但为什么编译器不检查我们。
是否有任何情况下这种代码是正确的和有意的?因此,编译器不能总是说它做错了吗?
或者编译器是否存在技术上的困难?
例如,文章通常会说,如果malloc和delete配对,或者说它是错误的并且不这样做。为什么不编译导致未定义行为的代码错误
但为什么编译器不检查我们。
是否有任何情况下这种代码是正确的和有意的?因此,编译器不能总是说它做错了吗?
或者编译器是否存在技术上的困难?
很多原因。离开我的头顶。
某些未定义的行为可能会将已定义的效果定义为实现特定的扩展。
一些未定义的行为仅基于程序的环境或输入发生,因此代码可能会导致未定义的行为,但不一定会这样做。
许多未定义行为的实例很难诊断。可能涉及可能在后续翻译单元中发生冲突的事情。如果他们很容易诊断,那么标准可能需要实施来发布诊断,就像在许多情况下一样。
编译器不一定知道指针是否使用new
,malloc
创建,或者它只是指向堆栈上的某个指针。但是,内存调试器(如valgrind)可以找到这些错误中的一部分。
那么,你会怎么说呢?
int* p = (int*)malloc(sizeof(p));
foobar(&p);
delete p;
foobar
是在不同的编译单元中。你不知道它做了什么。
在某些情况下,实际上理论上不可能确定malloc是否与删除配对。试想一下halting problem和程序结束时的删除。