Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内存泄漏_C_Linux_Valgrind - Fatal编程技术网

C 内存泄漏

C 内存泄漏,c,linux,valgrind,C,Linux,Valgrind,我写了一个程序,将一个字符串五乘五分块。这是我的节目 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 *heapS

我写了一个程序,将一个字符串五乘五分块。这是我的节目

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();
}
我的程序运行良好。但是当我试图通过Valgrind运行这个程序时,我得到了以下消息。它说有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)
尽管我清除了堆中的所有内存,但我从4个上下文中得到了12个错误。我的错误是什么?

一步一步来

大小为1的写入无效
您的
malloc()
没有为字符串终止符分配空间,但是
strcpy()
尝试写入它。使用

char *heapString = malloc(len + 1);
相反。(注意:
void*
char*
!)。为简单起见,您也可以尝试使用(非标准)
strdup(cont)

Invalid free()/delete/delete[]/realloc()
您的
temp
指向
text
中的
char
。使用
free()
没有任何意义,因为那里没有任何分配。取消那个电话

大小为1的读取无效
这应该与第一个错误有关。值得注意的是,在
print()
中,如何在编译时
printf(“%s\n”,temp->str)
转换为(更快的)
put(temp->str)
。这就是Valgrind抱怨调用
put
的原因

大小为8的读取无效

在释放后,您可以阅读
temp

一步一步

大小为1的写入无效
您的
malloc()
没有为字符串终止符分配空间,但是
strcpy()
尝试写入它。使用

char *heapString = malloc(len + 1);
相反。(注意:
void*
char*
!)。为简单起见,您也可以尝试使用(非标准)
strdup(cont)

Invalid free()/delete/delete[]/realloc()
您的
temp
指向
text
中的
char
。使用
free()
没有任何意义,因为那里没有任何分配。取消那个电话

大小为1的读取无效
这应该与第一个错误有关。值得注意的是,在
print()
中,如何在编译时
printf(“%s\n”,temp->str)
转换为(更快的)
put(temp->str)
。这就是Valgrind抱怨调用
put
的原因

大小为8的读取无效

释放后,您将读取
temp