如果静态分配了一个函数指针数组,我还需要free()
吗?
假设我有这段代码:
typedef void (*test_ptr)(void);
int main(void)
{
test_ptr test[3];
test[0] = a;
test[1] = b;
test[2] = c;
}
所以,当我完成它时,我是否必须释放所有指针,也许是这样:
for(int i = 0; i < 3; i++) {
free(test[i]);
}
或者当函数结束时它会像其他数组一样自动解除分配吗?
答案 0 :(得分:4)
绝对不是!
像这样分配的数组位于堆栈中,free
如果你尝试的话会失败。
顺便说一下,你显示的数组是而不是“静态”。我认为你的意思是“本地”,甚至是“自动”(虽然这可能与C ++概念混淆)。
除此之外。 2:堆栈上的分配意味着你应该不以这种方式分配大型数组。堆栈通常具有有限的容量,因此任何大的都应该通过malloc
分配。
答案 1 :(得分:4)
所以,当我完成它时,我是否必须释放所有指针
没有。您不能因为free(ptr)
仅在ptr
个系列函数之前返回指针malloc
时使用。
将free
指针传递给任何其他对象(如变量或数组元素)会导致未定义的行为。
[...]如果
ptr
是空指针,则不会发生任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用free
或realloc
释放空间,则行为未定义。
或者当函数结束时它会像其他数组一样自动解除分配吗?
是。一旦其封闭函数返回,它将不再存在。
答案 2 :(得分:2)
一旦创建它们的函数结束,就会销毁像你的情况那样的自动局部变量。在您的情况下,当main()
函数结束时它们将被销毁。
因此,您不必明确free()
这些变量。
答案 3 :(得分:2)
该代码是否拥有指向对象,是否分配了与free
(malloc
realloc
calloc
)对应的分配函数之一?
如果是,最后free
。
如果没有,请停止。
你显然是第二种情况......