Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MichaelB Mini JLI'ler
Anmeldedatum: 09.07.2005 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 03.08.2005, 11:44 Titel: Objekte oder Zeiger auf Objekte? |
|
|
Hallo,
ich hätte da mal eine Frage zum Umgang mit Objekten bzw. mit Arrays von Objekten. Im Grunde habe ich ja die Möglichkeit, entweder direkt mit Objekten oder mit Zeigern auf Objekte zu arbeiten. Siehe folgender Code:
Code: | // mit Pointern
CStar* testArray[5]; // nur das Pointer-Array mit leeren Adressen
testArray[0] = new CStar(); // unbedingt notwendig !!
testArray[0]->Bounce(); // Methodenaufruf über Pointer
delete testArray[0]; // Objekt wieder freigeben
delete [] testArray; // Array wieder freigeben
// ohne Pointer
CStar testArray2[5]; // intialisiert gleichzeitig mit Kopien
testArray2[0].Bounce(); // Methodenaufruf direkt
|
Beides funktioniert soweit wie es soll. Allerdings:Welche Vorgehensweise bevorzuge ich wann, bzw. was gilt als praktischer/besser/etc. ?? Beim Zugriff über Pointer muß ich hinterher (z.B. Destruktor) selbst mit 'delete' aufräumen, wie ist es da beim "direkten" Zugriff?
Danke im vorab,
Michael |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 03.08.2005, 11:46 Titel: |
|
|
1.) Bei dynamischen Sachen (wenn ich speicher freigeben und wieder beanspruchen will)
Als bsp:
Ich habe ein paar Bilder im Hauptmenü, die Bilder lade ich dynamisch jedes mal wenn ich aus dem Hauptspiel rausgehe und gebe sie anschliessend wieder frei.
Die 1. Methode benutze ich aber meistens mit der std in Form von lists, vectors, maps ...
2.) Bei statischen sachen
Wenn ich Variablen für einen Bereich brauche. Vor allem Buffer, ...
Die Variable ist sowieso nur einen bestimmten Bereich gültig, und man benötigt kein delete. _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.08.2005, 12:14 Titel: |
|
|
Soweit ich das jetzt verstanden habe, ist die Frage, ob ich Arrays, die Objekte enthalten, auf dem Heap oder normal auf dem Stack ablegen (lassen soll), oder?
Wie BLoD bereits richtig gesagt hat, Heap bei dynamischen, Stack bei lokalen Sachen...wobei man aufpassen sollte, dass der Zeiger (bei der Heap-Methode) seinen Gültigkeitsbereich nicht verliert, da hilft zuweilen eine tiefe Kopie mittels Kopierkonstruktor bzw. man muss sich nach einer anderen Lösung umschauen, soweit ich das verstanden habe...kommt halt auf das konkrete Beispiel an. |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 03.08.2005, 12:19 Titel: |
|
|
Stack-Zugriffe sind soweit ich weiß auch schneller als Heap-Zugriffe. |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 03.08.2005, 12:24 Titel: |
|
|
ich würde an deiner stelle die pointer bevorzugen. vor allem wenn du später das ganze auf ein data-driven design umstellen möchtest indem du z.b. die anzahl und eigenschaften deiner sterne aus einer datei ausliest. dann musst du dynamische arrays verwenden. |
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.08.2005, 12:56 Titel: |
|
|
@GreveN:
Wobei der Heap weit größer ist als der Stack ;) |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 03.08.2005, 13:09 Titel: |
|
|
proggaholic hat Folgendes geschrieben: | @GreveN:
Wobei der Heap weit größer ist als der Stack  |
kommt drauf an wie viel sachen du im stack speichern willst..
gibts da eigentlich eine beschränkung?  |
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.08.2005, 14:37 Titel: |
|
|
Ich denk schon...das war sicher ironisch, nicht? Ich mein, so "NewSchool" kann man doch gar nicht sein, um zu glauben, Speicher ist unbegrenzt o.O
Hach, ihr seit lustig ;) |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 03.08.2005, 15:25 Titel: |
|
|
Ist ein Feld nicht eigentlich auch nur ein Pointer
ich bevorzuge das mit dem statischen Speicher. Dynamische Speicher benutze ich nur im Notfall, weil die langsamer sind. Außerdem habe ich immer das Problem mit dem delete bzw delete[]. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 03.08.2005, 16:27 Titel: |
|
|
proggaholic hat Folgendes geschrieben: | Ich denk schon...das war sicher ironisch, nicht? Ich mein, so "NewSchool" kann man doch gar nicht sein, um zu glauben, Speicher ist unbegrenzt o.O
Hach, ihr seit lustig  |
du hast mich falsch verstanden. natürlich beschränkt der verfügbare speicher die größe des stacks. ich frage mich nur, ob es nicht möglich ist ein programm mit 510mb stack zu schreiben.. |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 03.08.2005, 17:22 Titel: |
|
|
Ich habe ganz schwach in Erinnerung:
Der Stack wird auf ca. 1 MB begrenz damit eine unbeabsichtigte Endlosrekursion nicht den ganzen Speicher vollknallt (stack-overflow).
Soweit ich weiß kann man aber einstellen (eventuell bei den Compiler-Optionen) wieviel Speicher dem Stack zukommt.
Ein Programm mit 500 MB Stack wäre daher wohl denkbar. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.08.2005, 18:42 Titel: |
|
|
500MB Stack-Code? Auf jeden Fall ist das möglich, irgendwie und irgendwo ;)
Zitat: | Außerdem habe ich immer das Problem mit dem delete bzw delete[]. |
Stimmt schon, das mit dem delete ist so eine Sache, aber wenn man es erstmal halbwegs kann, dann ist der Heap ein ganz nützliches Werkzeug...vor allem, weil der Stack sich selbst aufräumt...und dann auch noch das mit delete[] für Arrays, und wenn man eins vergisst, hat man plötzlich eine 510MB große Speicherlücke ;) |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 03.08.2005, 20:17 Titel: |
|
|
man kann aber auch die new und delete operatoren für den debug modus überladen und so loggen was freigegeben wird und was nicht  |
|
Nach oben |
|
 |
proggaholic Junior JLI'ler

Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.08.2005, 20:37 Titel: |
|
|
Dann isses ja noch komplizierter ;)
+ Operator, der subtrahiert ;)
"delete", das wie "new" arbeitet, und "new", das Speicher wieder freigibt^^ |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 03.08.2005, 20:39 Titel: |
|
|
wer hat denn das gesagt? new soll loggen dass ein objekt erzeugt wurde (und sonst genauso arbeiten wie das normale new). und delete loggt, dass wieder eines freigegeben wurde.
danach weiß man so ziemlich fix, ob man leaks hat oder nicht. |
|
Nach oben |
|
 |
|