繁体   English   中英

免费的函数指针数组

[英]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一个指向任何其他对象(如变量或数组元素)的指针会导致未定义的行为

C11:7.23.2.3的免费功能:

[...]如果ptr是空指针,则不会发生任何操作。 否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则该行为是undefined


还是像其他数组一样在函数结束时自动取消分配?

是。 一旦其封闭函数返回,它将不再存在。

自动局部变量(如您所用的局部变量)将在创建它们的函数结束后立即销毁。 就您而言,它们将在main()函数结束时被销毁。

因此,您不必显式地free()这些变量。

该代码是否拥有指向对象的代码,并且被分配了与freemalloc realloc calloc )相对应的分配函数之一?

如果是这样,请在最后free它。

如果没有,请停止。

您显然在第二种情况下...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM