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