记录此行为的位置(如果有的话)?
当您在块中间的C中声明指针时,它可能处于错误状态(指向不可用的内存),并且您无法使用标准if (a) free(a)
来释放它。
想到的最简单的程序是
#include <stdlib.h>
int main(int argc, char *argv[]){
if(argc > 1) goto END;
char *a = NULL;
a = calloc(1,1);
END:
if(a) free(a);
}
运行没有参数的程序,它运行正常,如果你用至少一个参数运行它,它可能会破坏如下: 令人惊讶的是(对我来说),如果你用clang编译它,它可能会工作(在我的OS X上它确实有效,但在NetBSD上却没有)。如果你使用gcc,它总是返回一个
malloc: *** error for object 0x7fff5fc01052: pointer being freed was not allocated
请注意,与块头部的声明相同的程序是正确的。
修改:请注意,问题是关于文档。我意识到我所描述的是不安全的,但我找不到明确显示它的地方。
答案 0 :(得分:3)
&#34;模式&#34;
if(a) free(a);
当然不是标准,或者至少它不应该是标准。 安全将NULL
传递给free()
,因此if
无法添加 。
如果你跳过初始化,我希望a
的值是未定义的(不太可能是NULL
),这对我来说非常有意义。这真是毛茸茸的代码,不要这样做。
可以说,goto
和标签的存在意味着没有实现的范围,并且free(a);
语句完全没有理由标签(&#34;不可见&#34;定义a
的范围)。