Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was free gemacht hat!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.12.2003, 15:35 Uhr
Pablo
Supertux
(Operator)


Gibt es eine Möglichkeit zu bestimmen, ob die Pointers, die in free - Funktion waren, tatsächlich gelöscht wurden? Ist der Wert dann NULL? Also,


C++:
type* foo()
{
    type* = n;
    n = (type*) malloc(sizeof(type));
    return n;
}

void foo2()
{
    type* m = foo();
    free(m);
    // ist hier m==NULL? Kann man erfahren, ob free das richtige gemacht hat?
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.12.2003, 15:38 Uhr
typecast
aka loddab
(Operator)


Nein m ist nicht NULL. Du musst den Wert von Hand setzen. Wenn was schief geht, dann wird eine Fehlermeldung auf den stderr gegeben. Mehr weiß ich leider auch nicht.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.12.2003, 15:52 Uhr
ao

(Operator)



Zitat:
Pablo Yanez Trujillo postete
Gibt es eine Möglichkeit zu bestimmen, ob die Pointers, die in free - Funktion waren, tatsächlich gelöscht wurden?

Nein, wie loddab schon sagte. free darf nur auf Pointer losgelassen werden, die mit malloc, calloc oder realloc zugewiesen wurden. Auch new/delete und malloc/free nicht mischen!

Die einzige Möglichkeit, wie dein Programm erkennen kann, ob ein Pointer gefree't wurde oder nicht, ist, dass du jeden Pointer unmittelbar hinter dem free() selber auf NULL setzt.

Man kann sich hierfür ein Makro schreiben und sich angewöhnen, es ausschließlich zu benutzen:


C++:
#define FREE(p) free (p); p = NULL



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.12.2003, 19:29 Uhr
Pablo
Supertux
(Operator)


Dabke für die Antwort. Ich mische new/delete und malloc/free nicht, da ich nur C programmiere und wenn ich was in C++ mache, dann versuche ich nicht mit C zu mischen.


Meine Frage bzgl. NULL war deshalb, weil du (@ao) mir schon mal gesagt hast, dass nicht immer wenn es keine "Segmentation fault" kommt, das richtige gemacht wurde. Da die Pointers nicht in der selben Funktion mit malloc allokiert werden wie die Funktion wo sie gefree't werden, habe ich mir gedacht, es könnte eine solche Fälle passieren, dass ich keine Segmentation fault bekomme, aber den Speicher nicht freimacht.

Also, im Prinzip gibt es keine Funktion bzw. Makro, mit dem ich sicher sein kann, dass eine Variable gefree't wurde?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.12.2003, 22:14 Uhr
ao

(Operator)


Mit *sehr* großer Wahrscheinlichkeit funktionieren malloc und free richtig, da kann man sich schon blind drauf verlassen.

Aber warum fragst du, hast du ein Speicherleck, das du nicht findest?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.12.2003, 22:25 Uhr
Pablo
Supertux
(Operator)


Das ist eben, was ich herausfinden will.

Wenn ich sowas mache wie:

C++:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
    
char* cpy(){
    char* tmp;
    tmp = (char*) malloc(strlen("Hallo")+1);
    return tmp;
}
    
int main()  
{
    char* a;
    char* b;
    a=(char*) malloc(strlen("Hallo")+1);
    b=cpy();
    a=strcpy(a,"Hallo");
    b=strcpy(b,"Hallo");
    printf("%s  %s\n", a,b);
    free(a);
    free(b);
    printf("%s  %s\n", a,b);
    return 0;
}



Kriege ich:

Code:
Hallo  Hallo
P@P@  Hallo


Warum? Warum behält b immer nich Hallo? Und wenn ich nochmal free(b) habe, dann kriege ich ein Segmentation Fault, das mir sagt, b wurde schon gefree't. Aber weiso behält b immer noch Hallo und a nicht? Deshalb dachte ich mir, das könnte ein Speicherleck sein.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.12.2003, 14:12 Uhr
RHBaum



@Pablo

Was fuer nen BS verwendest du ....

free sagt aus, das der Speicherbereich freigegeben werd muss, aber sagt nicht aus, das der speicherbereich ned ueberschrieben werden darf :p

Sicher muss nur sein, das b (die Adresse) ned geaendert werden darf ...

Windows z.b. Muellt speicher gern mit debug infos zu ...

Was anderes ist auch die speicherverwaltung. Bei windows ist dein Zeiger keine Physikalische Adresse ... sondern ne referenz, welche vom BS selber untendrunter auch geaendert werden kann. SOlange der Zeiger gueltig ist, haelt Windows die refernz / zeiger / Speicherinhalt immer konsistent. wenn der Zeiger deleted wurde, macht er es nimmer ... jetzt braucht windows nur noch mal kurz swappen, und schon hat sich der speicher unter deinem nimmer gueltigen zeiger geaendert .... Sollte aber bei deinem kleinen programm eher ned der fall sein :p

Compilier das mal in der release version, vielleicht hast da glueck !

Was mit deinem pointer nachher passiert, ist sache des BS und des compilers ... Und hat dich als braven C++ programmierer ned zu intressieren.
Warum ? weil das Wissen und die erkentnisse ueber solche eigenheiten nur theorethischer natur sind, und nie praktisch ausgenutzt werden sollten !!!

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.12.2003, 14:46 Uhr
0xdeadbeef
Gott
(Operator)


Ich würde vermuten, dass es mit dem Aufbau des Heaps zusammenhängt. Du alloziierst b vor a, dann löschst du a. Das heißt, b liegt am Ende des Heaps (Fragmentierung dürfte hier noch nicht auftreten), wo der Kernel vielleicht irgendwas besonderes macht. Das ist allerdings ziemlich ins Blaue geschossen, und macht jede Menge unsichere Annahmen über den Aufbau des Heaps. Genau kann ich es dir nur sagen, wenn du ein offenes Betriebssystem benutzt und ich genug Zeit und Lust habe, die entsprechenden Kernel-Sourcen danach zu durchsuchen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.12.2003, 19:09 Uhr
Pablo
Supertux
(Operator)


Hießt das, dass in Wirklichkeit das kein Speicherleck ist? Dass die Variable tatsächlich gefree't wird aber ob Daten im Speicher bleiben, spielt keine Rolle, weil sie überschrieben werden, wenn man diesen Speicher braucht? Dann wär's echt super!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.12.2003, 21:39 Uhr
ao

(Operator)



Zitat:
Pablo Yanez Trujillo postete
Hießt das, dass in Wirklichkeit das kein Speicherleck ist? Dass die Variable tatsächlich gefree't wird aber ob Daten im Speicher bleiben, spielt keine Rolle, weil sie überschrieben werden, wenn man diesen Speicher braucht? Dann wär's echt super!

Ich denke, genau das heißt es. Die Speicherverwaltung merkt sich nur, welche Brocken belegt oder wieder freigegeben wurden. Die freigegebenen mit bestimmten Bitmustern vollzuschreiben wär ja Zeitverschwendung. Debug-Versionen machen das trotzdem manchmal.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: