Nun, ich bin der segfault, den Sie an dieser Stelle erhalten, nicht, weil Sie versuchen, Speicher freizugeben, den Sie zuvor nicht zugewiesen haben. Der Segfault tritt auf, weil Sie versuchen, eine Speicheradresse zu referenzieren, für die das Betriebssystem Ihnen keine Berechtigung erteilt hat Sie zu Ihnen (das ist die Definition eines Segmentierungsfehlers).
Einige Experimente, sagen Sie Ihren Beispielcode in valgrind laufen würde, können Sie dies als Ausgabe erhalten würde:
==6945== Invalid free()/delete/delete[]
==6945== at 0x402265C: free (vg_replace_malloc.c:323)
==6945== by 0x80483D5: main (bla.c:6)
==6945== Address 0x7 is not stack'd, malloc'd or (recently) free'd
==6945==
==6945== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==6945== malloc/free: in use at exit: 4 bytes in 1 blocks.
==6945== malloc/free: 1 allocs, 1 frees, 4 bytes allocated.
Das ist also ein Speicherleck ‚pur sang‘. Angenommen, Sie würden den Code so ändern, dass der Zeiger, den Sie zu befreien versuchen, "nahe" dem zugewiesenen Zeiger ist (damit das Betriebssystem weiterhin weiß, dass Sie Zugriff darauf haben, gewährt das Betriebssystem keinen Speicherzugriff auf Bytegrenzen). Sagen wir den Code wie folgt ändern:
int main(){
int* c;
c = (int*)malloc(sizeof(int));
c++;
free(c);
return 0;
}
Wenn diese Anwendung ausgeführt wird Sie nicht mehr einen Segmentation Fault bekommen würde (vom Kernel emittiert), aber eine Warnung von glibc (der Besitzer von malloc() und free())
[email protected]:/tmp$ ./a.out
*** glibc detected *** ./a.out: free(): invalid pointer: 0x0804a00c ***
... followed by a trace
So sind Sie versuchen, etwas Speicher frei von denen der Kernel weiß, dass es dir gehört, aber von denen glibc erinnern kann es dir nicht verteilen. Wenn Sie dies in valgrind laufen (was die freie durch Ersetzen arbeitet(), malloc(), realloc(), ... Funktion in libc und Durchführung Buchhaltung auf eigene) Sie diese Ausgabe erhalten würde:
==6955== Invalid free()/delete/delete[]
==6955== at 0x402265C: free (vg_replace_malloc.c:323)
==6955== by 0x80483D2: main (bla.c:5)
==6955== Address 0x418a02c is 0 bytes after a block of size 4 alloc'd
==6955== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==6955== by 0x80483C0: main (bla.c:3)
==6955==
==6955== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==6955== malloc/free: in use at exit: 4 bytes in 1 blocks.
==6955== malloc/free: 1 allocs, 1 frees, 4 bytes allocated.
Das traditionelle Unix-Speicherbereinigungsschema: Führen Sie das Programm aus und fordern Sie den Speicher zurück, wenn es beendet wird. Funktioniert nicht gut mit IDEs und Browsern und anderen Programmen, die wahrscheinlich lange laufen werden. –