Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.06.2011, 22:19

[gelöst] Nervige Direct3D Memory-Leaks

Hallo, ich bins mal wieder :P

Ich habe ein Problem mit meheren D3D Memory-Leaks.
Ich weiß aber nicht wieso die überhaupt da sind, denn ich rufe immer brav Release() auf und das seltsamste ist, dass VS meint,
dass ich versuchen würde auf eine Unreferenzierte Adresse im Speicher zuzugreifen. Eben auch beim Aufruf von Release().
Die Klasse mit den Leaks ist ein Singleton ala Meyers.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class GraphicsDevice
{
private
    HWND              dummyWnd;
    IDirect3D9*       direct3d;
    IDirect3DDevice9* device;

    // Ctor, Copy-Ctor, Dtor, = Operator
public:
    static GraphicsDevice& GetInstance()
    {
         static GraphicsDevice inst;
         return inst;
    }
};


Der Destruktor sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
GraphicsDevice::~GraphicsDevice()
{
    if (device)   device->Release();
    if (direct3d) direct3d->Release();
    if (dummyWnd) DestroyWindow(dummyWnd);
}


Und wenn ich jetzt die Instanz erstellen lasse funktioniert auch alles damit nur das Freigeben der COM-Interfaces nicht. Warum?
Angemerkt sei, dass die Klasse in einer DLL ist und in ein anderes Programm mit eingebunden wird.

Ich hoffe ihr könnt mir weiterhelfen, ich bin am verzweifeln :(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ».:!Batzer!:.« (23.06.2011, 12:33)


idontknow

unregistriert

2

21.06.2011, 22:42

Debug halt mal den RefCount (AddRef gibt dir nen Wert vm TypUlong zurück der dem RefCount NACH dem inkrementieren entspricht)

3

21.06.2011, 23:04

Das hab ich. Der RefCount beträgt 2 nach dem AddRef(), was ja auch korrekt ist.
Der DX-Debug Output sagt halt auch nur, dass es mehere Leaks gibt und wo sie sind, eben die oben genannten Objekte.
Kann es etwas mit der DLL zu tun haben?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

22.06.2011, 07:02

Nun ist es ja doch ein Singleton, welches nur ein einziges Fenster erlaubt...
Werden die drei Variablen korrekt mit null initialisiert?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

22.06.2011, 17:25

Nun ist es ja doch ein Singleton, welches nur ein einziges Fenster erlaubt...

Nein ich werde für die "echten" Fenster SwapChains benutzen.
Ich habe mich für diesen Ansatz entschieden, da mehere Devices nicht benötigt werden.

Werden die drei Variablen korrekt mit null initialisiert?

Ja, eben in der Initialisierungsliste.
Einen Fehler beim erstellen der Objekte gibt es auch nicht, da sonst ein Exception geworfen werden würde und das Rendern funktioniert ja.

EDIT: Also nach min. 3 Stunden Fehlersuchen habe ich rausgefunden, dass die Memory-Leaks nur dann entstehen,
wenn ich das Singleton im DLL-Code erstelle. Heißt also, dass wenn ich die Klasse einfach mal in das Test-Programm schreibe
und dann die Intanz erstelle entsteht kein einziger Leak. Wieso ist das denn so?
Ich bin echt am verzweifeln :(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ».:!Batzer!:.« (22.06.2011, 22:51)


6

23.06.2011, 00:22

Also es scheint so als würden die Interface-Ptr nicht mehr ansprechbar sein wärend des Aufrufs des Dtors des statische Objekts.
Das verstehe ich nun gar nicht mehr.

EDIT: Mist. Wollte eigl. den anderen Post editieren. Sry.

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

7

23.06.2011, 01:02

Der Destruktor von globale Variablen, oder in deinem Fall statischen einer Funktion, werden in einer DLL innerhalb von DLLMain aufgerufen. Der Leak Detektor von Direct3D vermutlich schon vorher.

Aber selbst wenn nicht, es ist grundsätzlich schlecht, etwas innerhalb von DLLMain zu tun, benutz also keine globalen Variablen mit Dtor in DLLs. (Wobei es bei EXEs auch meist sinnvoll ist sowas zu vermeiden)

Ciao
Helmut
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

23.06.2011, 11:37

Ich habe mich für diesen Ansatz entschieden, da mehere Devices nicht benötigt werden.


"Nicht benötigt" ist aber kein Grund für ein Singleton. "Nicht erlaubt" wäre ein Grund ;)

9

23.06.2011, 12:33

@Helmut
Vielen Dank! Das ist auch der Grund, da laut dem Call-Stack von VS die DllMain erst nach dem Leak-Detect geschlossen wird.
Dann werde ich mir wohl etwas ausdenken müssen um das zu vermeiden :)

"Nicht benötigt" ist aber kein Grund für ein Singleton. "Nicht erlaubt" wäre ein Grund ;)

Ja da hast du recht, erlaubt sind mehere Devices auch nicht. Eben nicht erlaubt und nicht erwünscht ^^

Das Problem wäre dann damit gelüftet.
Vielen Dank an alle ;)

Werbeanzeige