gpt4 book ai didi

c - 删除资源

转载 作者:行者123 更新时间:2023-11-30 20:02:49 25 4
gpt4 key购买 nike

我是 C 初学者。我目前的任务是创建一个具有多个队列的程序。我应该如何纠正这个问题?根据我的理解,应该清除创建的所有队列。目前我认为我有内存泄漏。

#include <stdio.h> //printf etc
#include <stdlib.h> //malloc calloc realloc free
#include <stdint.h>

/* number of message queues */
#define MSGQS_LEN 5

/* number of nodes in the message queue */
#define CAPACITY 5

typedef struct _node {
const char* message;
struct _node* next;
} node_t;

typedef struct {
char qName;
node_t *front, *rear;
} msg_queue_t;


typedef struct {
msg_queue_t **queues;
} MsgQs_t;

最佳答案

您的代码有几个问题。

if(msg_queues < 0)
exit(EXIT_FAILURE);

这个测试不正确,如果 malloc 由于某种原因失败,msg_queues 将为 NULL,测试应该读取。

if(msg_queues == NULL)
exit(EXIT_FAILURE);
/* Relinquishes all resources currently held by a MsgQs_t.
The pointer to the MsgQs_t in question is set to NULL. */
MsgQs_t* unloadMsgQs(){
MsgQs_t *msg_queues;
msg_queues = NULL;

return(msg_queues);
}

您在堆栈上分配一个变量,将其初始化为 NULL 并从此函数返回 NULL。

您真正想要做的是将 MsqQs_t* 传递给 unloadMsgQs 并使用此指针作为 free 的参数,如下所示

void unloadMsgQs(MsgQs_t *msg_q) {
if(msg_q) {
free(msg_q);
}
}

如果你想将 msg_q 指针设置为 NULL,以便它不能再被重用,你可能应该这样做。

void unloadMsgQs(MsgQs_t **msg_q) {
if(msg_q && *msg_q) {
free(*msg_q);
*msg_q = NULL;
}
}

据我所知,我的建议是阅读更多关于 C 语言和指针编程的书籍/教程,因为看起来你还没有完全掌握基础知识(当然这没什么可耻的) !)

关于c - 删除资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59356065/

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