C 我需要在BinaryTree中释放根还是数据?
我有个问题。。。如果我有这样一个二进制树:C 我需要在BinaryTree中释放根还是数据?,c,pointers,malloc,binary-tree,C,Pointers,Malloc,Binary Tree,我有个问题。。。如果我有这样一个二进制树: typedef struct { char* text; char* line; struct Node* left; struct Node* right; }Node 并具有启动功能: Node *start(Node* ptr) { if(ptr == NULL) { ptr = (Node*)malloc(sizeof(Node)); ptr->text = "some text"; ptr-&
typedef struct
{
char* text;
char* line;
struct Node* left;
struct Node* right;
}Node
并具有启动功能:
Node *start(Node* ptr)
{
if(ptr == NULL)
{
ptr = (Node*)malloc(sizeof(Node));
ptr->text = "some text";
ptr->line = "another text";
ptr->left = NULL;
ptr->right = NULL;
}
return (ptr);
}
若根不是空的,在这里我必须给出我的文本和行动态内存,那个么在二进制树中添加左子元素的函数
Node* addNode(Node* ptr)
{
if(ptr != NULL)
{
Node* leftNode = (Node*)malloc(sizeof(zeiger));
char* text = (char*) malloc(100*sizeof(char));
char* line = (char*) malloc(100*sizeof(char));
line = "some text 2";
text = "another text";
if(leftNode !=NULL)
{
leftNode->text = text;
leftNode->line = line;
leftNode->right = NULL;
ptr->left = leftNode;
}
return leftNode;
}
return ptr;
}
现在的问题是,我想释放树中的所有内容,所以我有一个这样的函数,如果left或right或root不为NULL,就调用它自己。所以我看到了一些代码,我应该释放根而不是数据
void freeTree(Node* root)
{
while(1)
{
if(root == NULL)
{
break;
}
else if (root->left != NULL)
{
freeTree(root->left);
root->left = NULL;
}
else if (root->right) {
freeTree(root->right);
root->right = NULL;
}
else
{
free(root);
}
}
}
Main.c
int main(int argc, char const *argv[]) {
Node* root = NULL;
root = start(root);
root = addNode(root);
freeTree(root);
return 0;
}
你不应该释放你没有
malloc
的内存
这里,第一个节点的指针指向字符串文本。你不应该对它们调用free()
您还应该在初始节点中分配内存,然后尝试复制该字符串文本。现在每个节点都是相似的
现在释放每个节点的内存。先做哪个节点?后序遍历就是其中之一。首先释放子级,然后释放父级,否则将导致内存泄漏
void freeTree(Node *root){
if( root ){
freeTree(root->left);
freeTree(root->right);
free(root->text); // root->text was allocated calling malloc
free(root->line); // same for root->line
free(root);
}
}
根->文本是通过调用malloc分配的-您必须动态分配才能调用
free
。在代码中,初始节点的文本
指向字符串文本。您需要按照答案中所述的正确方式执行-(分配-并将字符串复制到新分配的内存中)。您不应该释放没有释放的内存malloc
这里,第一个节点的指针指向字符串文本。你不应该对它们调用free()
您还应该在初始节点中分配内存,然后尝试复制该字符串文本。现在每个节点都是相似的
现在释放每个节点的内存。先做哪个节点?后序遍历就是其中之一。首先释放子级,然后释放父级,否则将导致内存泄漏
void freeTree(Node *root){
if( root ){
freeTree(root->left);
freeTree(root->right);
free(root->text); // root->text was allocated calling malloc
free(root->line); // same for root->line
free(root);
}
}
根->文本是通过调用malloc分配的-您必须动态分配才能调用
free
。在代码中,初始节点的文本
指向字符串文本。您需要按照答案中所述的正确方式进行操作-(分配-并将字符串复制到新分配的内存中)。您必须释放所有内容,所有节点。如果你自己分配内存,你必须自己释放它,否则它就是内存泄漏,特别是如果你只释放根节点,那么子节点本身就不会被某种魔法释放。char*line=(char*)malloc(100*sizeof(char))代码>line=“一些文本2”代码>是内存泄漏。由于您立即丢失了指向已分配内存的指针,您将永远无法释放它。@Lanting在将其解析为树后是否应释放它?这是关于所有权的问题,如果节点“拥有”文本行,则每次重新分配指针时,都应释放旧值。但是,您的节点不拥有字符串常量。不能在指向字符串常量的指针上调用free。如果希望节点“拥有”字符串,则应将其strncpy
放入刚才分配的缓冲区。你必须释放一切,所有节点。如果你自己分配内存,你必须自己释放它,否则它就是内存泄漏,特别是如果你只释放根节点,那么子节点本身就不会被某种魔法释放。char*line=(char*)malloc(100*sizeof(char))代码>line=“一些文本2”代码>是内存泄漏。由于您立即丢失了指向已分配内存的指针,您将永远无法释放它。@Lanting在将其解析为树后是否应释放它?这是关于所有权的问题,如果节点“拥有”文本行,则每次重新分配指针时,都应释放旧值。但是,您的节点不拥有字符串常量。不能在指向字符串常量的指针上调用free。如果希望节点“拥有”字符串,则应将其strncpy
放入刚才分配的缓冲区。“根->文本被分配调用malloc”当然只有在兰廷在评论中提到的错误得到纠正时才是正确的above@IngoLeonhardt.:是的,当然……第一行是这么说的。我一到家就会明确地提到。谢谢请不要介意。@IngoLeonhardt.:检查一下。。我想应该更明确一些。“根->文本被分配给调用malloc”当然只有在Lanting在评论中提到的错误得到纠正时才是正确的above@IngoLeonhardt.:是的,当然……第一行是这么说的。我一到家就会明确地提到。谢谢请不要介意。@IngoLeonhardt:检查一下……我想应该更清楚些。