在C中释放结构的函数

时间:2016-10-17 18:26:16

标签: c memory-management struct malloc free

我遇到了一个问题,当我调用一个函数时,我写了一个结构,我的程序终止于第一个免费指令。

这是功能:

void deleteJobNode(struct jobNode *node) {
    free(node->burstTime);
    free(node->jobIndex);
    free(node->next);
    free(node->priority);
    free(node->remainingTime);
    free(node);
}

这是struct的定义和用于为结构分配内存的函数。

struct jobNode {
    struct jobNode *next;
    int jobIndex;
    int burstTime;
    int remainingTime;
    int priority;
};

struct jobNode *createJobNode(int newJobIndex, int newBurstTime, int newRemainingTime, int newPriority) {
    struct jobNode *newNode = (struct jobNode *)malloc(sizeof(struct jobNode));
    newNode->jobIndex = newJobIndex;
    newNode->burstTime = newBurstTime;
    newNode->remainingTime = newRemainingTime;
    newNode->priority = newPriority;

    if(newNode == NULL)
        printf("Node Creation Error");

    return newNode;
}

我按照建议编辑了免费功能:

void deleteJobNode(struct jobNode *node) {
    free(node);
}

但是我在运行时遇到这个错误:

*** Error in `/home/jack7521/workspace/req1b/Debug/req1b': double free or corruption (fasttop): 0x00000000010c2090 ***

4 个答案:

答案 0 :(得分:4)

每个free都需要malloc。您不需要释放struct的非动态字段,它们已经是struct本身的一部分,因此将指针释放到整个struct就足够了。

你只需要:

free(node);

答案 1 :(得分:2)

您对 malloc 进行一次调用;那么为什么你认为你需要多次调用免费?!

事情是:你只需要免费该结构一次 - 最终free(node)完成工作!

请记住这些方法为您做的事情: malloc 标记一个连续的内存区域供使用;和免费放弃区域。根本不需要释放你的结构成员。因为无论如何他们那个区域内。

或者从另一个角度来看:malloc为您提供了一堆字节。您以后使用“struct”“overlay”使用这些字节的事实并不重要!

答案 2 :(得分:0)

您只需将free与指向结构实例的指针一起使用。

void deleteJobNode(struct jobNode *node) {
  free(node); // will do the whole job
}

因为当您通过malloc调用分配一些内存时,这是 一大堆内存然后可以用free一次发布。

只有当你的struct包含指针本身也指向其他动态分配的内存时,你必须使用这些struct成员调用free

答案 3 :(得分:-1)

您将在' createJobNode'中返回本地变量(newNode)的地址。功能。 newNode在' createJobNode'之外没有任何可见性。功能。尝试为main函数中的newNode分配内存,并将其作为参数传递给createJobNode(在这种情况下,它将是一个void函数),如下所示

void createJobNode(struct jobNode* newNode, ...)
{
     //Fill the fields of newNode

}

int main(void)
{
   struct jobNode * newNode = malloc(sizeof(struct newNode));

   createJobNode(newNode, ...);

}

要释放分配的变量newNode,您需要调用:

free(newNode);