如果静态分配了一个函数指针数组,我是否仍然需要free()
它?可以说我有以下代码:
typedef void (*test_ptr)(void);
int main(void)
{
test_ptr test[3];
test[0] = a;
test[1] = b;
test[2] = c;
}
Run Code Online (Sandbox Code Playgroud)
因此,当我完成该操作后,是否需要释放所有指针,也许像这样:
for(int i = 0; i < 3; i++) {
free(test[i]);
}
Run Code Online (Sandbox Code Playgroud)
还是像其他数组一样在函数结束时自动取消分配?
绝对不!
像这样分配的数组位于堆栈上,free
如果您尝试它,将会严重失败。
顺便说一句,您显示的数组不是“静态”的。我认为你的意思是“本地”,甚至“自动”(尽管这可能与 C++ 概念混淆)。
撇开没有。2:在堆栈上分配意味着您不应该以这种方式分配大数组。堆栈的容量通常有限,因此任何大的内容都应该通过malloc
.
因此,当我完成该操作后,是否必须释放所有指针
不能。您不能因为free(ptr)
仅当系列函数中ptr
的任何一个malloc
函数先前返回指针时才使用它。将指针
传递free
给任何其他对象(如变量或数组元素)会导致未定义的行为。
[...]如果
ptr
为空指针,则不执行任何操作。否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用free
or 释放了空间realloc
,则该行为是undefined。
还是像其他数组一样在函数结束时自动取消分配?
是。一旦其封闭函数返回,它将不再存在。