[英]Memory Leak Valgrind
I wrote a program to chunk a string five by five. 我编写了一个程序,将字符串五乘五分块。 This is my program. 这是我的程序。
struct list
{
char *str;
struct list* next;
};
struct list* head = NULL;
void insert(char *cont)
{
struct list* temp = (struct list*)malloc(sizeof(struct list));
size_t len = strlen(cont);
char *heapString = (char*)malloc(len);
strcpy(heapString,cont);
temp->str = heapString;
temp->next = NULL;
if(head == NULL)
{
head = temp;
return ;
}
temp->next = head;
head = temp;
}
void print()
{
struct list* temp = head;
while(temp != NULL)
{
printf("%s\n",temp->str);
temp = temp->next;
}
}
void clearmem()
{
struct list* temp = head;
while(temp != NULL)
{
free(temp->str);
free(temp);
temp = temp->next;
}
}
int main()
{
char text[] = "abcdefghijklmno";
size_t len = strlen(text);
while(len !=0)
{
char *temp;
temp = text ;
temp = temp + len - 5;
insert(temp);
*(text+len-5) = '\0';
len = strlen(text);
free(temp);
}
print();
clearmem();
}
My program is working fine. 我的程序运行正常。 But when I try to run this program through Valgrind, I got the following messages. 但是,当我尝试通过Valgrind运行该程序时,收到以下消息。 It says there are 12 errors. 它说有12个错误。
==2055== Invalid write of size 1
==2055== at 0x4C32E0D: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x10888C: insert (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x1089BD: main (in /home/infant/Documents/Sample_codes/a.out)
==2055== Address 0x522d095 is 0 bytes after a block of size 5 alloc'd
==2055== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x108875: insert (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x1089BD: main (in /home/infant/Documents/Sample_codes/a.out)
==2055==
==2055== Invalid free() / delete / delete[] / realloc()
==2055== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x1089EB: main (in /home/infant/Documents/Sample_codes/a.out)
==2055== Address 0x1fff00030a is on thread 1's stack
==2055== in frame #1, created by main (???:)
==2055==
==2055== Invalid read of size 1
==2055== at 0x4C32D44: __strlen_sse2 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x4EBC9D1: puts (ioputs.c:35)
==2055== by 0x1088FC: print (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x1089FC: main (in /home/infant/Documents/Sample_codes/a.out)
==2055== Address 0x522d1d5 is 0 bytes after a block of size 5 alloc'd
==2055== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x108875: insert (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x1089BD: main (in /home/infant/Documents/Sample_codes/a.out)
==2055==
abcde
fghij
klmno
==2055== Invalid read of size 8
==2055== at 0x108947: clearmem (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x108A06: main (in /home/infant/Documents/Sample_codes/a.out)
==2055== Address 0x522d188 is 8 bytes inside a block of size 16 free'd
==2055== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x108942: clearmem (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x108A06: main (in /home/infant/Documents/Sample_codes/a.out)
==2055== Block was alloc'd at
==2055== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2055== by 0x108855: insert (in /home/infant/Documents/Sample_codes/a.out)
==2055== by 0x1089BD: main (in /home/infant/Documents/Sample_codes/a.out)
==2055==
==2055==
==2055== HEAP SUMMARY:
==2055== in use at exit: 0 bytes in 0 blocks
==2055== total heap usage: 7 allocs, 10 frees, 1,087 bytes allocated
==2055==
==2055== All heap blocks were freed -- no leaks are possible
==2055==
==2055== For counts of detected and suppressed errors, rerun with: -v
==2055== ERROR SUMMARY: 12 errors from 4 contexts (suppressed: 0 from 0)
Even though I cleared all the Memory in the Heap, I am getting 12 errors from 4 contexts. 即使我清除了堆中的所有内存,我还是从4个上下文中得到12个错误。 What is my error here? 我这是什么错误?
Step by step. 一步步。
Invalid write of size 1
Your malloc()
does not allocate space for the string terminator, but strcpy()
tries to write it. 您的malloc()
不会为字符串终止符分配空间,但是strcpy()
尝试写入它。 Use 采用
char *heapString = malloc(len + 1);
instead. 代替。 (Note: no need to cast void*
to char*
!). (注意: 无需将 void*
char*
为char*
!)。 For simplicity, you may also try to use the (non-standard) strdup(cont)
. 为简单起见,您还可以尝试使用(非标准) strdup(cont)
。
Invalid free() / delete / delete[] / realloc()
Your temp
points to a char
in text
. 您的temp
指向text
一个char
。 It makes no sense to use free()
, as there's nothing allocated there. 使用free()
没有任何意义,因为那里没有分配任何东西。 Remove that call. 删除该呼叫。
Invalid read of size 1
This should be related with the first error. 这应该与第一个错误有关。 It is interesting to note how, in print()
, at compile time printf("%s\\n",temp->str)
is translated to a (faster) puts(temp->str)
. 有趣的是,在print()
,如何在编译时将printf("%s\\n",temp->str)
转换为更快的puts(temp->str)
。 That's why Valgrind is complaining about a call to puts
. 这就是为什么Valgrind抱怨puts
。
Invalid read of size 8
In 在
free(temp);
temp = temp->next;
you read temp
after it has been freed. 您在释放后阅读了temp
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.