free()
-
hoi,
also das seh ich jetzt zum ersten mal und wollte mich schnell mal informieren ob das normal ist. ich hab folgenden code
playlistitem_t *pl = ( playlistitem_t* ) malloc( sizeof( playlistitem_t ) ); pl->index = 23; pl->value = 5; free( pl ); printf( "%u / %u\n", pl->index, pl->value );
der code funtkioniert einwandfrei und ich kann noch die richtigen daten auslesen. was ich mir jetzt vorstellen kann, dass der speicher freigegeben wurde aber noch nicht überschrieben und deswegen noch richtig an der stelle ist. wenn ich das gleiche mit einem character mache wird er aber gleich gelöscht und ich kann nach dem free() nichtmehr darauf zugreifen. was ist da also los?
mfg blan
-
falsche reihenfolge...
blan schrieb:
free( pl ); printf( "%u / %u\n", pl->index, pl->value );
nach dem 'free' darfst du den pointer nicht mehr dereferenzieren, denn der speicher, auf den der pointer zeigt, wandert in den 'free pool' zurück. wenn es manchmal klappt und manchmal nicht, ist das bestenfalls 'undefiniertes verhalten'.
btw: der type-cast vor 'malloc' ist überflüssig und sogar ein klein wenig gefährlich. eine funktion, die einen 'void*' zurückliefert, braucht niemals gecastet zu werden. du kannst einen void* ohne cast jedem anderen pointer zuweisen. das mit dem cast machen merkwürdigerweise viele falsch.
warum das so oft falsch gemacht wird, ist mir aber nicht klar.
-
ich weiss schon, dass das free() nach dem printf() kommt.fands nur komisch, dass ich aufeinmal noch drauf zufgreifen kann. also hat sich meine theorie bestätigt, dass der speicher einfach noch nicht von einer andreren anwendung benutzt wurde.
zu der sache mit dem casten: das problem ist, dass der g++ das casten zwingend verlangt. wenn jemand jetzt die sache in C++ kapseln will bringt der g++ tausende fehler. das problem hatte ich deletzt mit der libmpdclient.
mfg blan
-
blan schrieb:
also hat sich meine theorie bestätigt, dass der speicher einfach noch nicht von einer andreren anwendung benutzt wurde.
mit 'free' meldest du der runtime-lib, bzw. dem heap manager, dass der speicher nicht mehr gebraucht wird. danach sollten zugriffe für dich tabu sein. wann, oder ob überhaupt, der speicher anderweitig verwendet wird, hast du nicht mehr unter kontrolle. es kann theoretisch sein, dass du direkt nach 'free' noch darauf zugreifen kannst, aber bereits einige millisekunden danach nur noch schrott ausliest.
blan schrieb:
zu der sache mit dem casten: das problem ist, dass der g++ das casten zwingend verlangt. wenn jemand jetzt die sache in C++ kapseln will bringt der g++ tausende fehler. das problem hatte ich deletzt mit der libmpdclient.
wenn du C und andere sprachen mischen willst, dann mach das am besten beim linken. C++ z.b. ist ziemlich verbuggt und verträgt sich nicht richtig mit C code.
-
vielleicht am besten immer sowas benutzen:
if ( pl != NULL ) { free(pl); pl = NULL; }
-
Undertaker schrieb:
C++ z.b. ist ziemlich verbuggt
Troll.
-
@rifkin: das
if
kannst dir sparen,free( 0 )
macht buchstäblich nichts.
@Undertaker (net, ten, vista, pale): <°)))o><greetz, Swordfish
-
******** schrieb:
Undertaker schrieb:
C++ z.b. ist ziemlich verbuggt
Troll.
keine angst. im C forum darf man das sagen. hier gibt es deshalb keine endlosen debatten
Swordfish schrieb:
@Undertaker (net, ten, vista, pale): <°)))o><
hab' ich hier wieder so viel quatsch erzählt?
-
Swordfish schrieb:
@rifkin: das
if
kannst dir sparen,free( 0 )
macht buchstäblich nichts.das if ist sowieso an der falschen Stelle, denn nach malloc hätte diese Überprüfung stattfinden müssen.
-
Lieber Undertaker,
Du bist doch so ein einsichtiger, rücksichtsvoller und verständnisvoller Typ. Da wäre es eigentlich mal an der Zeit, damit aufzuhören, hier einer ganze Menge Leuten ständig auf die Nerven zu gehen, und diesem Forum den Rücken zu kehren. Ich würde das sehr begrüßen.
Wenn du willst, kannst du es ja für dich so begründen, dass du ein paar unverbesserliche C++-Fanboys in ihrer Traumwelt zurücklässt, weil du es nicht übers Herz bringst, sie ständig mit der Wahrheit zu quälen.
Hauptsache, du verschwindest.
Aber letztendlich bleibst du hier und nervst weiter. Du hast viel zu viel Spaß daran, darum bist du ein Troll.
-
lieber MFK, das wird wieder ziemlich OT und deshalb wohl gleich gelöscht, poste sowas bitte das nächste mal da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-188695-and-highlight-is-.html
hin.
-
tolle diskussion hab ich hier ausgelöst
da ich sauber coden möchte - darf ich / sollte ich nun bei malloc() casten oder nicht?
mfg blan
-
blan schrieb:
da ich sauber coden möchte - darf ich / sollte ich nun bei malloc() casten oder nicht?
ich bin für 'nicht casten'
char *a = malloc(123); // richtig. char *b = (char*)malloc(123); // geht auch, aber... char c = (char)malloc(123); // ...hier merkt der compiler nicht, dass das ein fehler ist (char statt pointer)... char d = malloc(1234); // ...hier aber schon 'incompatible types' o.ä.
also: nicht casten hilft fehler zu erkennen.
-
blan schrieb:
da ich sauber coden möchte - darf ich / sollte ich nun bei malloc() casten oder nicht?
In C ist es guter Stil hier nicht zu casten. In C++ brauchst du diesen aber. Letztendlich ist es deine Entscheidung.
-
<off-topic>
@ Swordfish, MFK:
Schön habt ihr gefüttert, schön...@ net:
Provokationen wie diese sind, unabhängig vom Forum in dem sie geschrieben werden, Provokationen. Das weisst du natürlich. Du weisst auch, dass es immer Helden gibt die darauf anspringen.Wenn das so weitergeht, werde ich solche Threads einfach schliessen. Den Schaden hat dann der unschuldige OP und ihr tragt gemeinsam die Verantwortung. Glückwunsch.
</off-topic>
-
Tim schrieb:
@ net:
Provokationen wie diese sind, unabhängig vom Forum in dem sie geschrieben werden, Provokationen. Das weisst du natürlich. Du weisst auch, dass es immer Helden gibt die darauf anspringen.hmmm, jein, dass im C forum welche so abgehen hab' ich nicht gedacht (und auch nicht gewollt). ist wohl besser, ich halte mich demnächst etwas zurück mit solchen lästereinen...
-
Undertaker schrieb:
Tim schrieb:
@ net:
Provokationen wie diese sind, unabhängig vom Forum in dem sie geschrieben werden, Provokationen. Das weisst du natürlich. Du weisst auch, dass es immer Helden gibt die darauf anspringen.hmmm, jein, dass im C forum welche so abgehen hab' ich nicht gedacht (und auch nicht gewollt). ist wohl besser, ich halte mich demnächst etwas zurück mit solchen lästereinen...
Einsicht ist der erste Schritt zur Besserung