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

25.11.2003, 20:19

Problem mit der Speicherverwaltung

Hallo, wenn ich beim Debuggen mit dem VisualStudio mein Programm beende, erhalte ich immer folgenden Output:

Zitat


Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present
Der Thread 'Win32 Thread' (0x8f4) hat mit Code 0 (0x0) geendet.
Direct3D9: (ERROR) :Memory still allocated! Alloc count = 124
Direct3D9: (ERROR) :Current Process (pid) = 000008b8
Direct3D9: (ERROR) :Memory Address: 00384544 lAllocID=12 dwSize=000047f8, ReturnAddr=03523206 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 0038b594 lAllocID=20 dwSize=000019bc, ReturnAddr=0351dba9 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 0038b4bc lAllocID=21 dwSize=00000008, ReturnAddr=0351dc49 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 0038cf84 lAllocID=22 dwSize=00000dc0, ReturnAddr=035229b5 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 00388d74 lAllocID=31 dwSize=000006bc, ReturnAddr=0352eb9f (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 00389464 lAllocID=33 dwSize=00001d88, ReturnAddr=035241fb (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 0038b224 lAllocID=35 dwSize=00000008, ReturnAddr=0352432c (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 037a0064 lAllocID=37 dwSize=00003500, ReturnAddr=03523206 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 0038b264 lAllocID=38 dwSize=00000198, ReturnAddr=03523206 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 0038b434 lAllocID=39 dwSize=00000030, ReturnAddr=03523206 (pid=000008b8)
Direct3D9: (ERROR) :Memory Address: 037a359c lAllocID=40 dwSize=00001020, ReturnAddr=03523206 (pid=000008b8)
Direct3D9: (ERROR) :Total Memory Unfreed From Current Process = 55984 bytes


Woran liegt das? Ich habe eigentlich alle COM-Objekte released, und alle Klassen mit delete gelöscht.

Please help!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

25.11.2003, 20:34

Also erstmal meine Main:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//global Application-Class 
//andere Scripts greifen darauf mittels: extern CDxApp* DxApp zu;
CDxApp* DxApp = new CDxApp();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, char* pcCommand, int iShow)
{   
    InitCommonControls();
    
    DoSettingsDialog();
    
    if(DxApp->bContinue == true)
    {
        DxApp->DxCreateWindow();
        DxApp->DxInit();
        DxApp->DxAppLoop();
    }
    
    DxApp->DxAppExit();

    return 0;
}


Kontruktor der Klasse CDxApp:

Quellcode

1
2
3
4
5
6
7
8
9
10
CDxApp::CDxApp(void)
{
    Intro = new CIntro();
    DxDemo = new CDxDemo();
    fTime = NULL;
    pDevice = NULL;
    pD3D = NULL;
    fCycleTime = NULL;
    GameState = INTRO;
}


Aufräum-Methode:

Quellcode

1
2
3
4
5
6
7
8
9
10
 bool CDxApp::DxAppExit()
{
    TB_SAFE_RELEASE(pD3D);
    TB_SAFE_RELEASE(pDevice);
    delete Intro;
    delete DxDemo;
    UnregisterClass("DxWndClass",GetModuleHandle(NULL));
    delete this;
    return true;
}


Die Klasse an sich:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#pragma once
#include <windows.h>
#include <d3d9.h>
#include <stdio.h>
#include "CIntro.h"
#include "CDxDemo.h"
#include "macros.h"
#include "resource.h"
#include "typedefs.h"



class CDxApp
{
public:
    CDxApp(void);                   ~CDxApp(void);              

    //Methods
    bool DxCreateWindow();      
    bool DxInit();
    bool DxAppLoop();   
    
    bool DxCheckDevice();
    bool DxAppManager();        
    bool DxAppExit();               

    //Members
    HWND DxWnd;             

    bool bRunning;  
    bool bContinue; 

    sCfgData  localConfig; 
    float  fAspect;  
    float  fCycleTime; 
    float  fTime; 
    eGameStates GameState; 

    PDIRECT3D9     pD3D; 
    PDIRECT3DDEVICE9       pDevice; 
    D3DPRESENT_PARAMETERS    D3Dpp; 

    //Scenes
    CIntro*  Intro;
    CDxDemo* DxDemo;

};


DxDemo und Intro räumen auch alle Texturen und Vertex-Buffer auf. Ich weiss einfach net woran sowas potentiell liegen könnte. :(

thx for helping

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.11.2003, 20:36

Naja, der Code bringt mir eigentlich garnix, man muss ja wissen, was Deine Methoden machen... allegemeine Tipps: am Ende folgendes aufrufen:

pD3DDevice->SetTexture(0, NULL);
pD3DDevice->SetTexture(1, NULL);
pD3DDevice->SetTexture(2, NULL);
pD3DDevice->SetTexture(3, NULL);
...
pD3DDevice->SetStreamSource(0, NULL, 0, 0);
pD3DDevice->SetIndices(NULL);

5

25.11.2003, 21:00

hmm, daran lags leider nicht. Irgendwelche anderen Tips? Woran könnte es denn potentiell liegen? Vielleicht hilf mir das ja weiter.

6

25.11.2003, 23:41

Hallo!
Du löschst deine Hauptklasse DxApp gar nicht.
Füge nach der Funktion ->Exit(..) noch ein

Quellcode

1
delete DxApp
ein.
Hats nun geklappt?
mfg

7

26.11.2003, 02:12

Falsch er loescht seine Application Class. Schau dir mal die Methode bool CDxApp::DxAppExit() genauer an. Das wuerde wenn auch nur zu einem Memory Leak fuehren.

Nein das Problem liegt wo anders. Die Methode GetClientRect scheint einen Fehler zu verursachen. Das ist eine Funktion der WinAPI. Entweder wird dein Fenster nicht richtig erstellt, oder geloescht bevor du dein D3D Device loescht. Ueberpruefe mal die Reihenfolge.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

26.11.2003, 07:08

Ist von "delete this;" nicht abzuraten?

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

9

26.11.2003, 12:55

Ich würd ja sagen, das ist genauso als würde man ein Programm löschen das noch geöffnet ist.

Du löscht ja die Instanz der Klasse in der du dich grade befindest.

Ciao DarthB :huhu:

Jumping Jack

Treue Seele

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

10

26.11.2003, 17:14

Ja schon aber die rücksprungaddresse ist ja auf dem stack.
Was sollte da denn passieren?

Es kann natürlich sein, dass der compiler am funktionsende irgendwas einfügt wobei auf this zugegriffen wird...glaube ich aber nicht.

Werbeanzeige