[英]Free array of function pointers
如果静态分配了函数指针数组,我是否还需要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]);
}
还是像其他数组一样在函数结束时自动取消分配?
绝对不!
这样分配的数组位于堆栈上,如果您尝试使用free
,则free
将会严重失败。
顺便说一句,您显示的数组不是 “静态”的。 我认为您的意思是“本地”,甚至“自动”(尽管可以与C ++概念混淆)。
除了没有 2:在堆栈上分配意味着您不应以这种方式分配大数组 。 堆栈通常具有有限的容量,因此任何大的都应通过malloc
分配。
因此,当我完成该操作后,是否必须释放所有指针
不可以。因为只有当malloc
系列函数中的任何一个指针先前返回了指针ptr
时,才使用free(ptr)
。
free
一个指向任何其他对象(如变量或数组元素)的指针会导致未定义的行为 。
[...]如果
ptr
是空指针,则不会发生任何操作。 否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用free
或realloc
释放了空间,则该行为是undefined 。
还是像其他数组一样在函数结束时自动取消分配?
是。 一旦其封闭函数返回,它将不再存在。
自动局部变量(如您所用的局部变量)将在创建它们的函数结束后立即销毁。 就您而言,它们将在main()
函数结束时被销毁。
因此,您不必显式地free()
这些变量。
该代码是否拥有指向对象的代码,并且被分配了与free
( malloc
realloc
calloc
)相对应的分配函数之一?
如果是这样,请在最后free
它。
如果没有,请停止。
您显然在第二种情况下...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.