gpt4 book ai didi

当释放指向函数的指针时崩溃

转载 作者:行者123 更新时间:2023-11-30 20:44:47 24 4
gpt4 key购买 nike

我有以下结构

typedef struct test {
int action;
void *data;
void (*function)(int, void*);
} test;

int execute_func(void(*function)(int a, void *d), int action, void *data)
{
struct test *todo;

todo = calloc (1,sizeof(struct test));
if (todo == NULL)
{
return -1;
}
todo->action = action;
todo->data = data;
todo->function = function;
todo->function(todo->action, todo->data);
return 0;
}

执行该函数后,我想使用以下命令释放分配的结构:

if(todo != NULL)
{
if(todo->data != NULL)
{
free(todo->data);
}
if(todo->function != NULL)
{
free(todo->function); //Cause a crash
}
free(todo);
}

但是我遇到了崩溃。

最佳答案

您只能释放已通过 malloc 分配的内存。所以,你不能自由发挥作用。函数指针存储静态内存中的地址。

if(todo != NULL)
{
if(todo->data != NULL)
{
free(todo->data);
}
free(todo);
}

此外,对data有同样的评论:您必须仅并且仅内存由 data 指向时释放它已动态分配 malloc .

从更一般的角度来看,只有当您是动态分配的内存的所有者时才释放它。

当您使用calloc时回答OP评论之一对于您的结构,您仅为结构分配内存: int和两个指针。您没有为函数或数据指向的内存分配内存。为了避免内存泄漏,您只需从结构中释放内存, int和两个指针(不适用于指向的内存,因为你不知道它们是如何分配的)

关于当释放指向函数的指针时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37785869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com