Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Lebensdauer von Klassenvariablen

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
02.09.2003, 15:50 Uhr
typecast
aka loddab
(Operator)


Ich habe eine Klasse, in der ich im private Teil die Deklaration:

C++:
private: char file[40];


stehen hab.
Im Destruktor arbeite ich in der vorletzen Zeile mit der Variablen. In der letzten Zeile habe ich ein

C++:
free(file);


stehen. Wird der Code abgearbeitet, dann wird folgende Warnung gebracht:

Code:
a.out in free(): warning: page is already free


Kann mir einer erklären, warum das so ist. Ich dachte, dass ich den Speicher den ich da belegt habe auch wieder frei geben muss.
--
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
001
02.09.2003, 15:53 Uhr
virtual
Sexiest Bit alive
(Operator)


1. Warum machst Du ein free auf einen Speicherbereich, den du niemals mit malloc belegt hast? - file braucht nicht gefreet zu werden!

2. Warum benutzt du in C++ free, wenn es auch delete[] tun würde?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.09.2003, 16:04 Uhr
typecast
aka loddab
(Operator)


Ich habe bis jetzt nicht viel mit Pointern und Arrays gearbeitet. Da bin ich mir nie so ganz sicher, wann ich Speicher frei geben muss und wann nicht. Da muss ich noch einiges lernen. Aber was ich immer noch nicht verstehe ist, warum der Speicher zu diesem Zeitpunkt schon frei gegeben wurde. Ich hab die Varaible doch erste eine Zeile darüber benutzt
--
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
003
02.09.2003, 16:04 Uhr
ao

(Operator)


Der Speicher darf nicht ge-free't werden, weil er nicht ge-malloc't wurde. malloc und free gehören 1:1 zusammen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.09.2003, 16:07 Uhr
typecast
aka loddab
(Operator)


Ok. Und wie sieht es mit delete aus?
--
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
005
02.09.2003, 16:12 Uhr
ao

(Operator)



Zitat:
Loddab postete
Ich habe bis jetzt nicht viel mit Pointern und Arrays gearbeitet. Da bin ich mir nie so ganz sicher, wann ich Speicher frei geben muss und wann nicht. Da muss ich noch einiges lernen. Aber was ich immer noch nicht verstehe ist, warum der Speicher zu diesem Zeitpunkt schon frei gegeben wurde. Ich hab die Varaible doch erste eine Zeile darüber benutzt


Siehe oben. Du musst Speicher mit free freigeben, wenn du ihn mit malloc oder calloc oder realloc geholt hast. Wenn du ihn mit new geholt hast (C++), musst du ihn mit delete oder delete[] freigeben. In allen anderen Fällen darfst du ihn nicht freigeben.

free darf nur auf Zeigervariablen angewendet werden. Arrays (deklariert als int Array [IrgendeineLaenge]) werden niemals gefree't.

Ich hoffe, ich hab nichts vergessen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.09.2003, 16:13 Uhr
typecast
aka loddab
(Operator)


Ok danke
--
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
007
02.09.2003, 16:14 Uhr
Pablo
Supertux
(Operator)


Ich glaube, dass delete auch 1:1 zu new gehört, wie malloc zu free
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.09.2003, 16:15 Uhr
virtual
Sexiest Bit alive
(Operator)


Anmerkung:

Das mapping ist so:

malloc -> free
new -> delete
new[] -> delete []

Ein häufig gemachter Fehler ist:

malloc -> free
new -> delete
new[] -> delete

Wenn man aber delete[] nicht im letzten Fall anwendet, bekommt man Speicherlöcher, weil nicht von jedem Objekt der dtor aufgerufen wurde (ungünstiger Fall) oder Das programm core-dumpt (günstiger Fall)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.09.2003, 16:30 Uhr
0xdeadbeef
Gott
(Operator)


Wenn meine Meinung dazu jemanden interessiert - so wie ich das sehe, sollte man es vermeiden, malloc, new und new[] zu vermeiden. Es ist eine häufige Quelle für Heisenbugs, und in der Regel lässt es sich auch anders lösen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: