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):
C#-Quelltext
1: 2:
| if (this.textureID != -1) { Gl.glDeleteTextures(1, ref 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...