ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4396119
Jetzt (Chat):
22 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

FAQ - Frequently Asked Questions - DirectX


Debug: Break on Memory Leaks

Zitat:
Break on memory leaks heisst nur, dass vor dem endgültigen Beseitigen der zurückgebliebenen D3D-Objekte ein int 3 aufgerufen wird. Das ist quasi ein Software-Haltepunkt, der den Debugger zum anhalten bringt. Du kannst dann mit dem Debugger deine Objekte nochmal angucken, um nachzusehen, wie die Leaks entstanden sein könnten. Der Code, in dem der Debugger da steht tut natürlich nichts zur Sache.

Jede Reseriverung bekommt auch eine von Programmstart an zählende eine ID zugewiesen. Wenn du dein Programm nicht veränderst, dann erhalten deine Objekte die gleichen IDs. Wenn du nach Programmende also ein Speicherleck siehst, kannst du dir die ID merken, im DirectX-Control Panel unter "Break on alloc. id" eintragen und beim nächsten Start wird ein int 3 bei der Reservierung (nicht erst bei Programmende) ausgeführt. Hier stehst du natürlich wieder irgendwo im asm-Dschungel, gehe also einfach im Callstack nach oben bis zur letzten Funktion, die du geschrieben hast, und schon weisst du genau, welches Objekt nicht freigegeben wurde.

Wenn du mit den Referenzzählungsregeln von COM nicht klarkommst, dann würde ich empfehlen, vor d3d9.h die Datei comdef.h zu #includen. Danach hast du für jedes D3D-Interface einen Smart-Pointer zur verfügung, z.B. IDirect3DDevice9Ptr oder IDirect3DVertexBuffer9Ptr, der dir den Release()-Aufruf abnimmt.

-Markus-


von cygon