Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Pointer Frage

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 <
000
18.11.2004, 16:36 Uhr
KaraHead



Hi, hab mal ne Frage:
Muss man alle Pointer wieder freigeben?
Ich weiss, dass ich delete benutzen soll wenn ich einen Pointer mit new allokiert habe.
Doch wie ist es mit den normalen Pointern, wie:

C++:
int *ptr;
...



thx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.11.2004, 16:45 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Wenn Du ptr irgendwann mal was mit new zuweist, mußt Du es hinterher auch wieder freigeben. Wenn Du aber z.B. schreibst


C++:
int *ptr;
int i = 5;

...

ptr = &i;



, dann nicht.
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 18.11.2004 um 16:45 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.11.2004, 17:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


um die frage nochmal aufzugreifen... alles was auf dem stack liegt musst du nicht wieder freigeben nur was du mit new im heap angelegt hast musst du wieder freigeben... wenn du also für deinen pointer keinen speicher (für den pointer selber meine ich jetzt nicht für das worauf der pointer zeigt) allokiert hast brauchst du auch nix wieder freizugeben...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.11.2004, 17:14 Uhr
KaraHead



Ach stimmt ja ein Pointer ist nur ein Zeiger wenn ich nicht allokiere.

Danke hab's jetzt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.11.2004, 19:01 Uhr
RHBaum



nen "Pointer" ist immer nen Zeiger, zumindest wenn ich meine englisch lehrerin frage :-)

fuer c:

alles was du mit malloc anlegst, musst du mit free wieder freigeben ....
also ist es immer eine gute idee, die sachen da zu zerstoren, wo man sie auch anlegt, bzw paarweise funktionen dazu zu basteln.

fuer die anwender (also die funktionen die nen zeiger auf was uebergeben bekommen und damit arbeiten muessen) soll es vollkomen wurscht sein, wo das teil erzeigt wurde, aufn heap oder stack ... egal.

zusaetzlich fuer C++ ...

Zeiger die keinen ungueltigkeitswert in form von Null-Zeiger brauchen .... sollte man nicht ueber zeiger, sondern ueber referenzen abhandeln ... das spart bei Objekten das dereferenzieren ....
also, wenn du immer ne gueltige adresse erwartest, und es kommt mal keine, dann isses wurscht ob das programm knallt wegen ner ungueltigen referenz oder nem nicht abgefangenen Null-pointer :-)

Ausnahemen sind sachen, wo du mittels CCtoren operierst (std::list std::vector und so) , weil dort wuerde er das objekt wirklich kopieren, anstatt nur den zeiger ....
Vererbung geht auch, solange zumindest keine CCtoren verwendest ... dann wirds komplizierter ...

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.11.2004, 14:07 Uhr
~Pler
Gast


Zu beachten ist auch, dass Speicher, der "hinter" Zeigern allociert wurde, freigegeben wird, bevor man den Zeiger auf eine Neue Adresse zeigen lässt!

So verliert man zB die alte Adresse:
ptr = (char*)malloc( ... )

Jetzt kann man den früheren Speicher nicht mehr mit free freigen, weil wie schon gesagt die Adresse fehlt!!!
also immer zuerst free(ptr), und dann ein neues malloc( .. )!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.11.2004, 17:26 Uhr
~jana
Gast


zu 000:

Kommt drauf an, wo Dein Programm laufen soll. Normaler Weise wird der Pointer nach dem Beenden des Blockes indem er steht wieder zerstoert, ich weiss aber nicht wie das beim Programmieren mit MFC ist.
(... wenn ich mich richtig erinnere ... existieren die einmal angelegten Variablen oder Pointer nach dem Block weiter ... schau einfach mal irgendwo genau nach, wo was ueber die Lebensdauer von Variablen/alloziierten Pointern usw. steht ... bei den Microsoft Foundation Classes sind die Namensbereiche anders definiert als man annehmen sollte)

zu 001:
o.k. wenn Du ptr dereferenzierst, dann kriegst Du 5 heraus,
... musst aber bedenken, wie lange i haelt ...


zu 002:
(Hinweis: ich wuerde aber nicht unbedingt alles ueber den stack laufen lassen, denn dieser wird bei jedem neuen Aufruf der Funktion/Memberfunktion durchgegangen (die Variablenwerte bleiben zwar erhalten, aber lange Stacklisten sind nicht so superschoen) ... nur das in den Stack legen, was Du da wirklich brauchst
... ist aber am Anfang nicht so gravierend, sollte man nur im Auge behalten, und ausserdem werden die Computer eh immer schneller)


zu 003:
mit den Referenzen uebergeben sieht konkret so aus:

(CCtoren ... muss ich erst mal nachlesen ... und Vererbung ist ne CPP-Sache, wo man auch erst mal ne Weile ueberlegen muss, war auch glaube ich nicht so das Thema)


zu 005:
kann man ja mal schnell testen, was dann passiert, wenn man kein free gemacht hat ... im Debugger (gdb, ... oder welcher gerade benutzt wird) sich einfach die Adressen+Inhalt anzeigen lassen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.11.2004, 20:56 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von ~jana:
zu 000:

Kommt drauf an, wo Dein Programm laufen soll. Normaler Weise wird der Pointer nach dem Beenden des Blockes indem er steht wieder zerstoert, ich weiss aber nicht wie das beim Programmieren mit MFC ist.
(... wenn ich mich richtig erinnere ... existieren die einmal angelegten Variablen oder Pointer nach dem Block weiter ... schau einfach mal irgendwo genau nach, wo was ueber die Lebensdauer von Variablen/alloziierten Pointern usw. steht ... bei den Microsoft Foundation Classes sind die Namensbereiche anders definiert als man annehmen sollte)



Nur zur Klarstellung:
Variablen gelten stets nur innerhalb des Blocks in dem sie deklariert sind oder in untergeordneten Blöcken. Wird der Block verlasssen, sind sie weg. Fort. Tot. da ist die MFC nicht anders.
--
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
008
25.11.2004, 21:23 Uhr
Spacelord
Hoffnungsloser Fall


Ich denke Jana spielt darauf an dass bei VC++ 6 Variablen ,die in for Schleifen deklariert wurden, hinterher noch bekannt sind.
Ansonsten wären mir nichts bekannt.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: