JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Timing der Speicherverwaltung und - freigabe

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 13.10.2006, 18:42    Titel: Timing der Speicherverwaltung und - freigabe Antworten mit Zitat

Ich hab mich erst kürzlich gefragt, wie der Computer eigentlich vorgeht, wenn es um die Reihenfolge der Speicherfreigabe geht. Auf meinen Fall konkretisiert heißt das, wann welcher Destruktor aufgerufen wird.

Das Problem hat sich bemerkbar gemacht, als der Destruktor eines Singletons(1) früher aufgerufen wurde als der Destruktor einer anderen Klasse(2), indem voriger Singleton(1) noch benutzt werden sollte.

Eine Lösungsmöglichkeit war, die Instanz der Klasse(2) irgendwo lokal zu erstellen und global (bzw. in einem namespace) nur einen Zeiger darauf (anstatt die Instanz selbst) zu speichern.
So in der Art:
CPP:
namespace _global
{
    CLASSmyclass* pointer_to_class=NULL;
}

int WINAPI WinMain(...)
{
    CLASSmyclass class_instance(...);
    _global::pointer_to_class=&class_instance;
}


Es gibt zwar wirklich schlimmere Probleme, aber was würdet ihr in einer solchen Situation machen oder kennt ihr eine andere Lösung?
Gibt es irgendeine bestimmte Reihenfolge(sicher ist sie bestimmt Razz), in der z.B. im Falle eines Singletons (static) Objekte aus dem Speicher genommen werden?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


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

BeitragVerfasst am: 13.10.2006, 19:50    Titel: Antworten mit Zitat

Ein Konstruktor sollte eigentlich nur die Aufgabe haben Speicher wieder freizugeben. Ich weiß nicht genau was du machst. Eigenltich soltle man die Finger von globalen Variablen lassen. Sag mal konkret was du machen willst und wir können dir eine alternative anbieten. Irgendwie willst du eine KLasse freigeben oder so, habs aber nicht verstanden was genau und wo.
_________________
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
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 13.10.2006, 21:56    Titel: Antworten mit Zitat

Dragon hat Folgendes geschrieben:
Eigenltich soltle man die Finger von globalen Variablen lassen.

Darum habe ich sie in einen namespace getan Wink
So viel "Globalität" braucht man bei manchen Dingen eben.

Was ich mache:
Ich habe eine Klasse als Singleton(1), die u.a. wichtige Punkte im Programm loggt und in eine Datei speichert. Dazu gehört auch das Deinitialisieren. Nun habe ich z.B. eine Klasse(2), die die ganze Direct3D-Arbeit übernimmt. In dem Destruktor(2) wird natürlich alles schön freigegeben(jedenfalls normalerweise). Um das zu überprüfen, würde ich gerne wie beim Initialisieren von D3D9 auch beim Freigeben mitloggen, was geklappt hat und wo Fehler aufgetreten sind.
Wie es ein dummer Zufall will, ist nun aber zu dem Zeitpunkt, zu dem ich die Ergebnisse der D3D9-Freigabe im Destruktor(2) mitloggen will schon der Destruktor meines Singletons(1) aufgerufen worden, wodurch ich eine Zugriffsverletzung bekomme.

Offenbar liegt hier wenn die Instanz der D3D9-Klasse(2) zerstört wird schon meine Singleton Referenz(static member der Klasse(1)) in Schutt und Asche.

Meine Frage war jetzt, ob man auch ohne den Umweg mit dem Zeiger+lokale Instanz der D3D9-Klasse(2) die Reihenfolge, in der die Destruktoren der beiden Klassen(1, 2) aufgerufen werden, ändern kann.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 13.10.2006, 22:09    Titel: Antworten mit Zitat

Also ich pauschalisiere jetzt ein wenig aber hat nicht eigentlich jeder selbst die Kontrolle darüber wo und wann seine D3D9 Instanz vernichtet wird? Ich meine du wirst ja nicht unkontrolliert ->Release() aufrufen oder unbeaufsichtigt deine RefPtr arbeiten lassen welche dies für dich übernehmen.

btw was spricht gegenden Aufbau:

CPP:
class k_Application
{
public:
  k_Application();
  void RunApplication();
  void InitComponents();
  void DeInitComponents();
};



und deine Components beinhalten dann halt zB deine GrafikEngine, GUIEngine etc, so kannst du zB in einer Beschreibung innerhalb von initComponents festlegen was in welcher Reihenfolge geladen wird und in DeInitComponents() entlädst du diese Komponenten in umgekehrter Reihenfolge wieder.

Einfach von vorne bis hinten durchplanen und fertig Smile
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 13.10.2006, 22:15    Titel: Antworten mit Zitat

Hmm, gut, was mache ich, wenn das Programm aus irgendeinem Grund unterbrochen wird?
Der Destruktor ist doch soweit ich weiß mit dem "Service" ausgestattet, dass er auf jeden Fall am Ende des Programms(bzw. wenn die Instanz zerstört wird) aufgerufen wird.

Keine Ahnung, wie das so üblich ist. Ich dachte immer, dass es dazugehört und auch richtig ist, dass man den Kon- und Destruktor explizit für ihre Aufgabenbereiche nutzt.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 13.10.2006, 22:48    Titel: Antworten mit Zitat

Dann machs wie Windows und starte den Rechner neu Wink

Nene, für solche Fälle musst du als programmierer natürlich sorgen und demenstsprechende Fehlerkontrollen einbauen.

Patrick wird dazu wohl noch etwas besseres sagen können.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
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