分配或不分配。读取大小1错误无效。 [凝视2小时]

时间:2015-02-11 18:18:00

标签: c memory-leaks valgrind

这是我正在处理的代码

code

但是有问题。部分或全部可能是因为没有为节点中的data分配空间(第135行),因为linemain的迭代期间正在发生变化。但是当我为它分配空间时,在第135行,结果并没有太大变化而且存在内存泄漏。我被卡住了。

我快要疯了。你能帮我解决错误吗?

感谢任何帮助。谢谢!

输出:

a@ubuntu:~/os/hw1$ ./o f1.txt f2.txt o.txt
*** Error in `./o': double free or corruption (fasttop): 0x0000000001e8b250 ***
Aborted (core dumped)

Valgrind的:

a@ubuntu:~/os/hw1$ valgrind --leak-check=full ./o f1.txt f2.txt o.txt
==21643== Memcheck, a memory error detector
==21643== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==21643== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==21643== Command: ./o f1.txt f2.txt o.txt
==21643== 
==21643== Invalid write of size 2
==21643==    at 0x4C2F843: __GI_memcpy (vg_replace_strmem.c:917)
==21643==    by 0x4EA5ED7: getdelim (iogetdelim.c:115)
==21643==    by 0x400959: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid write of size 1
==21643==    at 0x4EA5FD4: getdelim (iogetdelim.c:122)
==21643==    by 0x400959: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c2 is 2 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4EC28BC: strtok (strtok.S:137)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4EC28EC: strtok (strtok.S:163)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4EC28F3: strtok (strtok.S:167)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid write of size 1
==21643==    at 0x4EC2919: strtok (strtok.S:186)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2EC31: strcmp (vg_replace_strmem.c:755)
==21643==    by 0x400A67: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2DB62: strlen (vg_replace_strmem.c:412)
==21643==    by 0x4EBF66D: strdup (strdup.c:41)
==21643==    by 0x400ABB: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2DB74: strlen (vg_replace_strmem.c:412)
==21643==    by 0x4EBF66D: strdup (strdup.c:41)
==21643==    by 0x400ABB: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 2
==21643==    at 0x4C2F840: __GI_memcpy (vg_replace_strmem.c:917)
==21643==    by 0x400ABB: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2EC48: strcmp (vg_replace_strmem.c:755)
==21643==    by 0x400A67: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid free() / delete / delete[] / realloc()
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x400985: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== 
==21643== HEAP SUMMARY:
==21643==     in use at exit: 0 bytes in 0 blocks
==21643==   total heap usage: 10 allocs, 11 frees, 1,878 bytes allocated
==21643== 
==21643== All heap blocks were freed -- no leaks are possible
==21643== 
==21643== For counts of detected and suppressed errors, rerun with: -v
==21643== ERROR SUMMARY: 22 errors from 12 contexts (suppressed: 0 from 0)

2 个答案:

答案 0 :(得分:2)

第一次释放line后,应将其设为NULL,将len设为0

if (line)
    free(line);
line = NULL; /* make it NULL so you can call getline() again or just don't free it yet */
len  = 0;

getline()的其他后续调用将尝试访问无效指针。

另外,正如我评论的那样

if(newPtr->data == NULL)
    free(newPtr);

是错误的,因为无论如何你都会取消引用newPtr,所以你必须

if (newPtr->data == NULL)
{
    free(newPtr);
    return;
}

答案 1 :(得分:1)

在第138行,如果条件为假(无法为字符串分配空间),那么你忘了返回,即:

if(newPtr->data == NULL) {
    free(newPtr);
    return;
}

如果发生这种情况,肯定会导致内存问题。可能还有其他问题(仍在搜索......)