| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: C - double free or corruption im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Meepmeep. Ich hab ein Problem beim erstellen einer verketteten Liste für einen Prozess-Scheduler. Ich versuche per folgender Methode den ...
![]() |
| | #1 (permalink) |
| Registriert seit: 07.05.07 ![]() Likes: 19 | Anzeige Meepmeep. Ich hab ein Problem beim erstellen einer verketteten Liste für einen Prozess-Scheduler. Ich versuche per folgender Methode den Speicher für einen struct freizugeben. Code: void mtDelThread(ThreadCB* tcb)
{
free((void*)(tcb->stack));
free(tcb);
} Code: typedef struct ThreadCB {
unsigned tID; // thread-ID
unsigned tPrio; // thread priority
unsigned readyTime; // time, when a a waiting thread
// can be activated, in clock ticks
TMethod startMethod; // pointer to the user thread metcbod
void *arg; // poniter to the argument of the metcbod
unsigned long stackpointer; // current stackpointer of the thread
unsigned long stack; // bottom of stack
int firstCall; // thread runs for the first time
} ThreadCB; Beim Aufruf dieser Funktion aborted g++ bei folgender Zeile: Code: free(tcb); Code: free((void*)(tcb->stack)); Code: *** glibc detected *** ./test1: double free or corruption (fasttop): 0x09011c68 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6c501)[0xb74b9501] /lib/libc.so.6(+0x6dd70)[0xb74bad70] /lib/libc.so.6(cfree+0x6d)[0xb74bde5d] ./test1[0x8048cda] ./test1[0x80488d9] /lib/libc.so.6(__libc_start_main+0xe7)[0xb7463ce7] ./test1[0x80485e1] output Nun meine Frage. Was genau bedeutet diese Fehlermeldung? Wie lässt sich das Verhalten erklären, vor allem im Bezug darauf, dass er erst beim deallozieren des eigentlichen ThreadCB probleme macht, nicht jedoch davor? |
| | |
| | #2 (permalink) |
| Registriert seit: 21.08.10 ![]() Likes: 10 | Die Zeile free((void*)(tcb->stack)); ist quatsch, da die Variable 'stack' eine Primitive ist. (unsigned long stack Du musst unterscheiden zwischen Objekten und Primitiven. Eine Instanz einer Struktur oder einer Klasse ist ein Objekt, welches du ggf. dynamisch allokierst mit *alloc bzw new. Diese Objekte - falls dynamisch allokiert - musst du dann auch zu einem gewissen Zeitpunkt wieder freigeben (free bzw delete). Bei Primitiven ist das anders, diese Variablen werden stets vollständig kopiert. /€1: Oh, jetzt seh ich erst was da geschieht ... du speicherst in der Variablen 'stack' eine Adresse ... Das lässt das ganze dann natürlich anders aussehen. Trotzdem ist das etwas verwirrend, warum die Adresse in einen ulong speichern, wenn du einfach einen Pointer anlegen kannst? An dieser Stelle solltest du dann darauf achten, dass tcb->stack nicht auf tcb zeigt. Geändert von blue182 (26.02.11 um 16:00 Uhr) |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |