如果我们使用free()
释放自动变量会怎样?
在以下代码中如何:如果n
为static
,它会在最后一次循环迭代后自动获取,我们可以free
,还是什么?
for(count = 0; count < 5; count++) {
static int i += 1
}
答案 0 :(得分:3)
如果我们使用
free()
释放自动变量会怎样?
它将调用未定义的行为。
free
的参数必须是内存分配函数返回的指针(malloc
,calloc
,realloc
)。 1}}的调用无效。
答案 1 :(得分:0)
如果free()
是自动变量,则结果未定义。
static
变量由运行时清理。没有必要free
他们。
free
仅用于您使用malloc/calloc
答案 2 :(得分:0)
free
的唯一有效参数是之前调用其中一个*alloc
函数(malloc
,calloc
的结果,或realloc
)或NULL
。而已。
auto
个变量在其封闭范围的生命周期内存在;尝试在其中调用free
将调用未定义的行为(可能导致访问冲突或段错误)。
static
变量在程序的生命周期中存在,即使它们的可见性仅限于特定范围; i
循环中的for
在程序启动时分配并保持到程序终止,但只能在for
循环的范围内访问。与auto
变量一样,尝试在静态变量上调用free
将调用未定义的行为,并可能导致运行时错误。
答案 3 :(得分:0)
free()
的单个参数是指针,传递非指针将无法编译,所以问题没有实际意义。
传递先前未从堆分配函数返回但以前未传递给free()
的指针的效果未定义 - 但从未有用,或纠正,通常是致命的。
实际上,free()
将假定指针是从堆分配的块;实现可能会检测到错误,或者它可能会破坏堆。可能无法检测到错误,并且在稍后的堆操作中将导致本质上未定义的故障,这使得确定原始原因非常困难。
在典型的实现中,分配的块前面是堆元数据; free()
通过从传递给它的指针中减去元数据的大小来访问此数据。对于非堆分配的指针,读取的数据将是无效的废话。该实现可能能够验证此数据并导致运行时错误,但在一个简单的实现中,元数据可能只包含块的大小,并且可能会将未定义大小和不适当位置的块添加到堆中。