gpt4 book ai didi

c - 什么时候应该释放动态分配的内存?

转载 作者:行者123 更新时间:2023-12-04 11:51:32 25 4
gpt4 key购买 nike

本质上,我创建了一段由树组成的代码,其中每个树节点都有自己的包含数据的链表(每个 treeNode 也包含数据)。这样每个 treeNode 都可以拥有该特定 treeNode 的多个数据项。

为了创建这个结构,我调用了一个树节点,将该树节点的地址传递给 createListNode 函数,然后调用了一个 ListNode。我的困惑实际上源于,我到底应该在哪里释放内存?仅在程序结束前返回 0;在主要或其他地方。请记住,一旦所有输入都添加到树和列表中,它就会要求用户输入名称,并显示适合该名称的数据链接列表。

干杯。

T.C.

编辑:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

typedef struct ListNode {
char *number;
struct ListNode *next;
}ListNode;

typedef struct TreeNode {
char *name;
ListNode *numbers;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;

TreeNode* AddNode(TreeNode *, char *, char *);
void AddNum(TreeNode *, char *);
void N_Print(TreeNode* root);
TreeNode* SearchTree(TreeNode* root, char *search);

int main(void) {
char my_string[50], name[25], number[25];
TreeNode *root = NULL;
while ((fgets(my_string, 50, stdin)) != NULL) {
if (my_string[0] == '.')
break;
sscanf(my_string, "%s %s", name, number);
root = AddNode(root, name, number);
}
N_Print(root);
free(root);
free(root->numbers);
return 0;
}

TreeNode* AddNode(TreeNode *root, char *name, char *number) {
int comparison;
if (root == NULL) {
root = (TreeNode*)calloc(1,sizeof(TreeNode));
root->name = strdup(name);
root->left = root->right = NULL;
AddNum(root, number);
}else if ((comparison = strcasecmp(name, root->name)) < 0)
root->left = AddNode(root->left, name, number);
else if ((comparison = strcasecmp(name, root->name)) > 0) {
root->right = AddNode(root->right, name, number);
} else if ((comparison = strcasecmp(name, root->name)) == 0 ) {
AddNum(root, number);
}
return root;
}

void AddNum(TreeNode *tn, char *number) {
ListNode *ln = (ListNode *)calloc(1, sizeof(ListNode));
ln->number = strdup(number);
ln->next = tn->numbers;
tn->numbers = ln;
}

TreeNode* SearchTree(TreeNode* root, char *search) {
int comparison;
if (root == NULL) {
return NULL;
} else if ((comparison = strcasecmp(search, root->name)) == 0) {
return root;
} else if ((comparison = strcasecmp(search, root->name)) < 0) {
return SearchTree(root->left, search);
} else if ((comparison = strcasecmp(search, root->name)) > 0)
return SearchTree(root->right, search);
}

void N_Print(TreeNode* root) {
TreeNode* search_val;
char search[25];
while(1) {
printf("Type a name please: ");
scanf("%24s", search);
if (search[0] == '.')
break;
search_val = SearchTree(root, search);
if (search_val == NULL) {
printf("NOT FOUND\n");
continue;
}
ListNode* ln = search_val->numbers;
while ( ln != NULL) {
printf("%s\n", ln->number);
ln = ln->next;
}
}
}

最佳答案

您应该在不再需要时释放内存。这当然取决于您的应用程序的需求。

在垃圾收集环境(例如 Java)中,垃圾收集器会在没有任何内容指向它时释放内存。以此为起点,您希望确保在删除对内存的引用之前释放内存。

关于c - 什么时候应该释放动态分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8303927/

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