[英]Do not understand source of memory leak display in Valgrind
Having spent most of the day trying to build my own singly linked list program with CRUD operations I stumbled on some items and found the below program which I am using as a reference.花了一天的大部分时间尝试使用 CRUD 操作构建我自己的单链表程序后,我偶然发现了一些项目,并找到了以下我用作参考的程序。 Running valgrind on this program though it shows a memory leak and I don't understand how it is arising or how to get rid of it.在这个程序上运行 valgrind 虽然它显示内存泄漏,但我不明白它是如何产生的或如何摆脱它。 It shows the following location:它显示以下位置:
==51957== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1
==51957== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-
amd64-linux.so)
==51957== by 0x420959: insert_at_last (sllother.c:110)
==51957== by 0x4218C6: create_linked_list (sllother.c:102)
==51957== by 0x4206F7: main (sllother.c:35)
#include<stdio.h>
#include<stdlib.h>
struct linked_list
{
int number;
struct linked_list *next;
};
typedef struct linked_list node;
node *head=NULL, *last=NULL;
void create_linked_list();
void print_linked_list();
void insert_at_last(int value);
void insert_at_first(int value);
void insert_after(int key, int value);
void delete_item(int value);
void search_item(int value);
int main()
{
int key, value;
//Create a linked list
printf("Create Linked List\n");
create_linked_list();
print_linked_list();
//Insert value at last position to existing Linked List
printf("\nInsert new item at last\n");
scanf("%d", &value);
insert_at_last(value);
print_linked_list();
//Insert value at first position to existing Linked List
printf("\nInsert new item at first\n");
scanf("%d", &value);
insert_at_first(value);
print_linked_list();
//Insert value after a defined value to existing Linked List
printf("\nEnter a KEY (existing item of List), after that you want to insert a value\n");
scanf("%d", &key);
printf("\nInsert new item after %d KEY\n", key);
scanf("%d", &value);
insert_after(key, value);
print_linked_list();
//Search an item from Linked List
printf("\nEnter an item to search it from List\n");
scanf("%d", &value);
search_item(value);
//Delete value from List
printf("\nEnter a value, which you want to delete from list\n");
scanf("%d", &value);
delete_item(value);
print_linked_list();
return 0;
}
/*
User Defined Functions
*/
void create_linked_list()
{
int val;
while(1)
{
printf("Input a number. (Enter -1 to exit)\n");
scanf("%d", &val);
if(val==-1)
break;
insert_at_last(val);
}
}
void insert_at_last(int value)
{
node *temp_node;
temp_node = (node *) malloc(sizeof(node));
temp_node->number=value;
temp_node->next=NULL;
//For the 1st element
if(head==NULL)
{
head=temp_node;
last=temp_node;
}
else
{
last->next=temp_node;
last=temp_node;
}
}
void insert_at_first(int value)
{
node *temp_node = (node *) malloc(sizeof(node));
temp_node->number=value;
temp_node->next = head;
head = temp_node;
}
void insert_after(int key, int value)
{
node *myNode = head;
int flag = 0;
while(myNode!=NULL)
{
if(myNode->number==key)
{
node *newNode = (node *) malloc(sizeof(node));
newNode->number = value;
newNode->next = myNode->next;
myNode->next = newNode;
printf("%d is inserted after %d\n", value, key);
flag = 1;
break;
}
else
myNode = myNode->next;
}
if(flag==0)
printf("Key not found!\n");
}
void delete_item(int value)
{
node *myNode = head, *previous=NULL;
int flag = 0;
while(myNode!=NULL)
{
if(myNode->number==value)
{
if(previous==NULL)
head = myNode->next;
else
previous->next = myNode->next;
printf("%d is deleted from list\n", value);
flag = 1;
break;
}
previous = myNode;
myNode = myNode->next;
}
if(flag==0)
printf("Key not found!\n");
}
void search_item(int value)
{
node *searchNode = head;
int flag = 0;
while(searchNode!=NULL)
{
if(searchNode->number==value)
{
printf("%d is present in this list. Memory address is %d\n", value, searchNode);
flag = 1;
break;
}
else
searchNode = searchNode->next;
}
if(flag==0)
printf("Item not found\n");
}
void print_linked_list()
{
printf("\nYour full linked list is\n");
node *myList;
myList = head;
while(myList!=NULL)
{
printf("%d ", myList->number);
myList = myList->next;
}
puts("");
}
I added in the following code just before Return zero in main() as the author had nothing in their code to free the memory.我在 main() 中 Return zero 之前添加了以下代码,因为作者在他们的代码中没有任何内容可以释放内存。
// Free memory
node *ptr = head;
while (ptr != NULL)
{
node *next = ptr->next;
free(ptr);
ptr = next;
}
Thank you谢谢
The problem is in the deletion code void delete_item(int value)
.问题在于删除代码void delete_item(int value)
。 When the value is found, this function leaks the node being deleted:当找到该值时,此函数会泄漏正在删除的节点:
void delete_item(int value) {
node *myNode = head, *previous=NULL;
int flag = 0;
while(myNode!=NULL) {
if(myNode->number==value) {
if(previous==NULL)
head = myNode->next;
else
previous->next = myNode->next;
printf("%d is deleted from list\n", value);
flag = 1;
break;
}
previous = myNode;
myNode = myNode->next;
}
if(flag==0)
printf("Key not found!\n");
}
As you can see, this function lacks a call to free
.如您所见,此函数缺少对free
的调用。 You can fix this problem by adding a call to free(myNode)
before the break
.您可以通过在break
之前添加对free(myNode)
的调用来解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.