我遇到了一个问题,当我调用一个函数时,我写了一个结构,我的程序终止于第一个免费指令。
这是功能:
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 ***
答案 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);