Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构和malloc()/free()有问题_C_Malloc_Free_Struct - Fatal编程技术网

结构和malloc()/free()有问题

结构和malloc()/free()有问题,c,malloc,free,struct,C,Malloc,Free,Struct,我正在尝试将双链接列表映射到GUI。我基本上为列表中的每个节点创建一个按钮结构,将节点参数映射到按钮参数,然后在屏幕上显示它们。我可以添加很多按钮,超过500个,它们似乎保持了它们的独特数据,并且没有重叠。但是,当我只删除一个按钮时,下一个malloc()函数无法创建新按钮,我只能删除。如果我去掉free()函数,malloc()就不再失败。所以,我的问题是,我是否正确地创建和删除了这些结构 结构是从GUI库中获取的,我对该库进行了修改,以在特定硬件上工作 typedef struct {

我正在尝试将双链接列表映射到GUI。我基本上为列表中的每个节点创建一个按钮结构,将节点参数映射到按钮参数,然后在屏幕上显示它们。我可以添加很多按钮,超过500个,它们似乎保持了它们的独特数据,并且没有重叠。但是,当我只删除一个按钮时,下一个malloc()函数无法创建新按钮,我只能删除。如果我去掉free()函数,malloc()就不再失败。所以,我的问题是,我是否正确地创建和删除了这些结构

结构是从GUI库中获取的,我对该库进行了修改,以在特定硬件上工作

typedef struct
{
    obj_t    obj;     /**< object structure */
    string_t label;   /**< button label, NULL if no label */
    color_t  color;   /**< color of the button */
} button_t;

typedef struct obj_t
{
    int                   x;                 /**< x position, relative to parent */
    int                   y;                 /**< y position, relative to parent */
    unsigned              width;             /**< component widht */
    unsigned              height;            /**< component height */
    draw_t                draw;              /**< function to draw the component */
    handler_t             handler;           /**< function to handle mouse-input events */
    action_t              action;            /**< function to handle user action */
    struct obj_t         *parent;            /**< parent of the component */
    unsigned              agui_index;        /**< agui structure index */
    BOOL                  enabled;           /**< if set, component is enabled */
    BOOL                  visible;           /**<  */
    BOOL                  invalidated;       /**< if set, draw this component */
    BOOL                  invalidated_child; /**< children need to be redrawn */
    BOOL                  selected;           /**< component is selected */
    BOOL                  pressed;           /**< component is pressed */
    uintptr_t             tag;               /**< tag for general use */
} obj_t;

typedef struct
{
    int           x;         /**< x position */
    int           y;         /**< y position  */
    char         *text;      /**< string text */
    const font_t *font;      /**< string-text font */
    color_t       color;     /**< string-text color */
    fontstyle_t   fontstyle; /**< string-text font style */
    align_t       align;     /**< alignment with respect to x and y position */
} string_t;
然后,当用户在按钮上选择delete时,执行以下操作

button_t *newstep_button = (button_t*) objects[i];
obj_t *obj_step = (obj_t*) &newstep_button->obj;                
string_t *label_step = (string_t*) &newstep_button->label;
free(label_step->text);
free(label_step);
free(obj_step);
free(newstep_button);
编辑:添加了一些我在malloc()代码空间中遗漏的初始化代码

obj_t *obj_step = (obj_t*) &newstep_button->obj;
free(obj_step);
这里您试图释放一个非指针结构字段。您不应该这样做:当您调用
free
时,整个结构的内存将被释放,并且不需要单独释放字段。
标签
字段也是如此

如果您的结构具有分配给
malloc
的指针字段,则需要在释放结构本身之前分别释放它们

关于分配的
obj_步骤
label_步骤
变量,您需要释放它们,但从您发布的代码中不清楚存储它们的值的位置。如果它们没有在任何地方使用,您可以删除这两个
malloc
s

编辑:您的初始化代码基本上如下所示:

obj_t *obj_step = (obj_t*) malloc(sizeof(obj_t));
//... set members of obj_step
newstep_button->obj = *obj_step;   //this will copy the entire struct
因此您实际上不需要
obj\u步骤
:您可以直接设置
newstep\u按钮->obj
的成员,例如:

newstep_button->obj.x = 2;

我没有看到
label\u step->text
被设置为任何内容;有可能它没有被设置,或者被设置为指向未由
malloc()
分配的块,这就是失败的原因。

您没有将malloc返回的指针存储在button\t对象中

改变

typedef struct
{
    obj_t    obj;     /**< object structure */
    string_t label;   /**< button label, NULL if no label */
    color_t  color;   /**< color of the button */
} button_t;
自由贸易的这些变化:

button_t *newstep_button = (button_t*) objects[i];
obj_t *obj_step = newstep_button->obj;                
string_t *label_step = newstep_button->label;
free(label_step->text);
free(label_step);
free(obj_step);
free(newstep_button);

如果你释放了一些不是用malloc创建的东西,你所描述的听起来像是典型的行为。你基本上是在破坏内存分配列表——当malloc试图找到一些空闲内存时,它会崩溃

我必须看更多你的代码才能确定,但是你所有的自由声明在我看来都是可疑的。若要确定是否存在问题,请显示为每个语句分配空间的代码:

free(label_step->text);
free(label_step);
free(obj_step);
free(newstep_button);

我无法决定是投票赞成(因为你所说的关于
obj
成员的话是绝对正确的,而且可能是正确的答案)还是投票反对,因为你所说的关于成员自动释放的话(因为他确实有需要独立释放的指针成员)。我同意投票赞成,但是请澄清关于“自动”部分的问题。@Ernest:措辞不好,现在好了吗?我想让它们成为button结构的参数。我添加了初始化代码以澄清问题。感谢您的帮助,这正是问题所在。如果可以的话,我会投你一票,但我没有足够的代表。我的答案显示了如何走另一条路,改变顶层按钮对象来存储指针,然后分配它们,然后释放,就像你试图做的那样。
newstep_button->obj = obj_step;
newstep_button->label = label_step;
newstep_button->color = RED;
button_t *newstep_button = (button_t*) objects[i];
obj_t *obj_step = newstep_button->obj;                
string_t *label_step = newstep_button->label;
free(label_step->text);
free(label_step);
free(obj_step);
free(newstep_button);
free(label_step->text);
free(label_step);
free(obj_step);
free(newstep_button);