Выделять или не выделять. Недопустимое чтение ошибок размера 1.

Это код, над которым я работаю

code 

Однако есть проблемы. Некоторые или все могут быть из-за того, что не выделяют пространство для data в узлах (строка 135 ~), потому что line меняется во время итерации в main . Но когда я выделяю для этого место, на линии 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) 

После того, как вы освободите 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; } 

В строке 138, если условие ложно (не может выделить место для строки), вы забудете вернуться, то есть:

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

Это, если это произойдет, наверняка вызовет проблемы с памятью. Могут быть и другие проблемы (поиск по-прежнему …)