如何在C语言中释放此结构?

问题描述 投票:3回答:1

我有一个大学项目,在这里我必须创建一个库来处理来自终端的可执行文件的选项。

我创建了此struct options_s:

typedef struct option_s option_t;
struct option_s {
    char* keyword;
    enum { 
        OptVoid, 
        OptInt, 
        OptString, 
        OptFloat 
    } spec;
    union {
        void (*opt_void)();
        void (*opt_int)(int);
        void (*opt_str)(const char*);
        void (*opt_float)(float);
    } fct;
    option_t* next;
};

每个选项类型变量将包含一个以int,float,字符串或什么都不作为参数的函数。关键字是终端中选项的标识符,例如“ -o”,位于要传递给函数的值之前。

这是我初始化一个以int作为参数的选项的方式:

option_t* c_null(option_t* l, const char* kw){
    l = (option_t*) malloc (sizeof(option_t));
    l->keyword = (char*) malloc (strlen(kw) + 1);
    strcpy(l->keyword, kw);
    l->next = NULL;
    return l;
}


option_t* common(option_t* l, const char* kw){
    while(l->next != NULL) l = l->next;
    l->next = (option_t*) malloc (sizeof(option_t));
    l->next->keyword = (char*) malloc (strlen(kw) + 1);
    strcpy(l->next->keyword, kw);
    l->next->next = NULL;
    return l->next;
}

option_t* opt_int(option_t* l, const char* kw, void (*f)(int)){
    if(l == NULL){
        l = c_null(l, kw);
        l->spec = OptInt;
        l->fct.opt_int = f;
        return l;
    }else{
        option_t* o = common(l, kw);
        o->spec = OptInt;
        o->fct.opt_int = f;
        return l;
    }
}

我在释放选项时遇到问题。我为此写了这个函数:

void opt_delete(option_t* l){
    if(l->next != NULL) opt_delete(l->next);
    free(l->keyword);
    free(l);
}

这似乎不起作用。即使在运行通过该函数接收字符串的选项之后,执行opt->fct.opt_str("foo");仍会打印“ foo”。

我的代码可能是什么问题?

c memory-management malloc dynamic-memory-allocation free
1个回答
2
投票

free()函数不会清除内存,它只会从进程中释放内存,并让释放的空间可以自由地由另一个malloc()重新分配。

这意味着,如果您尝试访问已释放的内存块,则可以找到您写入的最后一个值。但是,这只是幸运的情况,因为对已释放或未分配的内存区域的访问是不确定的行为。

此问题可以帮助您:How do malloc() and free() work?

© www.soinside.com 2019 - 2024. All rights reserved.