JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2ec7c30a97d4bb9ea79ce7f0dfaf0b42Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Objekte oder Zeiger auf Objekte?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MichaelB
Mini JLI'ler



Anmeldedatum: 09.07.2005
Beiträge: 27

Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 11:44    Titel: Objekte oder Zeiger auf Objekte? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 11:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
proggaholic
Junior JLI'ler


Alter: 36
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 12:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 12:19    Titel: Antworten mit Zitat

Stack-Zugriffe sind soweit ich weiß auch schneller als Heap-Zugriffe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 12:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
proggaholic
Junior JLI'ler


Alter: 36
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 12:56    Titel: Antworten mit Zitat

@GreveN:
Wobei der Heap weit größer ist als der Stack ;)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 13:09    Titel: Antworten mit Zitat

proggaholic hat Folgendes geschrieben:
@GreveN:
Wobei der Heap weit größer ist als der Stack Wink

kommt drauf an wie viel sachen du im stack speichern willst..
gibts da eigentlich eine beschränkung? Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
proggaholic
Junior JLI'ler


Alter: 36
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 14:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 15:25    Titel: Antworten mit Zitat

Ist ein Feld nicht eigentlich auch nur ein Pointer Wink

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 16:27    Titel: Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 17:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
proggaholic
Junior JLI'ler


Alter: 36
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 18:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 20:17    Titel: Antworten mit Zitat

man kann aber auch die new und delete operatoren für den debug modus überladen und so loggen was freigegeben wird und was nicht Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
proggaholic
Junior JLI'ler


Alter: 36
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 20:37    Titel: Antworten mit Zitat

Dann isses ja noch komplizierter ;)
+ Operator, der subtrahiert ;)
"delete", das wie "new" arbeitet, und "new", das Speicher wieder freigibt^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 03.08.2005, 20:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum