Autor Beitrag
Fetze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 1



BeitragVerfasst: So 02.09.07 12:39 
Heyho. Ich hab da ein Problem mit einem selbstgeschriebenen Destruktor.

Die Sache ist die: Ich programmiere gerade eine 2D Game Engine auf Basis des Tao Frameworks und habe eine Textur-Klasse. Diese Texturklasse verweist mit einer Integer-ID auf eine OpenGL-Textur, die ich manuell per Befehl wieder freigeben muss. Nun habe ich folgenden Destruktorcode (Auszug):

ausblenden C#-Quelltext
1:
2:
if (this.textureID != -1) { Gl.glDeleteTextures(1ref this.textureID); }
this.textureID = -1;


Er funktioniert wunderbar, wenn ich ihn manuell außerhalb des Destruktors aufrufe und die Textur so manuell lösche / den Speicher freigebe. Sobald exakt derselbe Code mit exakt derselben Textur jedoch vom Destruktor aufgerufen wird, stürzt es in der OpenGL-Aufruf-Zeile ab. "Memory Access Violation", eine klassische Speicherschutzverletzung bei glDeleteTextures.

Wie kommt das denn nun?! Und: Wie kann ich diesen Code sicher aufrufen lassen, wenn jemand den letzte nVerweis auf seine Textur null setzt? Momentan funzt alles wunderbar, wenn man [Texturvariable].Dispose(); aufruft (Ich habe eine Weiche für manuelle und GC-Aufrufe, der obige Code wird bisher aufgrund des Bugs nur bei manuellen Aufrufen verwendet), aber wenn man [Texturvariable] = null; schreibt, verbleiben Speicherleichen bis zum Programmende...
Fetze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65
Erhaltene Danke: 1



BeitragVerfasst: So 30.09.07 15:31 
Ich habe das Problem lösen können, indem ich im Destruktor einfach alle Exceptions auffange, die bei Variablen-Nullsetzungen auftreten - so habe ich genau das erwünschte Verhalten.