|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 13.10.2006, 18:42 Titel: Timing der Speicherverwaltung und - freigabe |
|
|
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 ), 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 |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 13.10.2006, 19:50 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 13.10.2006, 21:56 Titel: |
|
|
Dragon hat Folgendes geschrieben: | Eigenltich soltle man die Finger von globalen Variablen lassen. |
Darum habe ich sie in einen namespace getan
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.10.2006, 22:09 Titel: |
|
|
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 _________________ "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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 13.10.2006, 22:15 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.10.2006, 22:48 Titel: |
|
|
Dann machs wie Windows und starte den Rechner neu
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 |
|
|
|
|
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
|