JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=e73053671fc7cb759987cb8be150613cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Memory leaks im Zusammenhang mit GetSurfaceLevel

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 25.03.2014, 17:42    Titel: Memory leaks im Zusammenhang mit GetSurfaceLevel Antworten mit Zitat

Hallo allerseits!
Ich habe ein Problem, bei dem ich etwas Hilfe gebrauchen könnte: Es handelt sich darum, daß nach dem Aufruf von >GetSurfaceLevel< die betreffende Textur sich nicht mehr ordnungsgemäß löschen läßt. Die Folge ist ein memory leak. Bei meiner Untersuchung habe ich außerdem festgestellt, daß in dem nachfolgenden Programm drei weitere memory leaks enthalten sind, für die ich keine Erklärung gefunden habe. Vielleicht kann ja jemand von Euch etwas dazu sagen. Hier das Programm:

CPP:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#include <windows.h>
#include <iostream>
#include <winnt.h>
#include <string.h>
#include <io.h>
#include <direct.h>
#include <d3d9.h>
#include <d3dx9tex.h>
#include <d3d9types.h>
#include <d3dx9core.h>
#include <dxerr9.h>

#include "resource.h"

#include "Grafik.h"
CGrafik Grafik;

#define ENTLASSE(p) {if(p) { (p)->Release(); (p)=NULL;}}
/*
#ifndef ReleasePpo
   #define ReleasePpo(ppo) \
      if (*(ppo) != NULL) \
      { \
         (*(ppo))->Release(); \
         *(ppo) = NULL; \
      } \
      else (VOID)0
#endif
*/

const int BSchirmbreite = GetSystemMetrics(SM_CXSCREEN);
const int BSchirmhoehe = GetSystemMetrics(SM_CYSCREEN);

//using namespace std;

HWND hGriff = 0;
HINSTANCE hInst = 0;

LPDIRECT3DDEVICE9 Grafikkarte;

IDirect3DSurface9 *Hintergrund = NULL;
IDirect3DSurface9 *Vordergrund = NULL;
IDirect3DSurface9 *Flaeche_Eins = NULL;
IDirect3DSurface9 *Flaeche_Zwei = NULL;

IDirect3DTexture9 *Apparat_2 = NULL;

char StatusPuffer[256];
char VerzeichnisPuffer[256];

bool bWindowed = false;




void Szene_Initialisieren(LPDIRECT3DDEVICE9 lpGeraet)
{
   Grafikkarte = lpGeraet;

   Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&Hintergrund);

   Grafikkarte->CreateOffscreenPlainSurface(
      BSchirmbreite,
      BSchirmhoehe,
      D3DFMT_X8R8G8B8,
      D3DPOOL_DEFAULT,
      &Vordergrund,
      0);

   Grafikkarte->CreateOffscreenPlainSurface(
      BSchirmbreite,
      BSchirmhoehe,
      D3DFMT_X8R8G8B8,
      D3DPOOL_SYSTEMMEM,
      &Flaeche_Eins,
      0);

   Grafikkarte->CreateOffscreenPlainSurface(
      BSchirmbreite,
      BSchirmhoehe,
      D3DFMT_X8R8G8B8,
      D3DPOOL_DEFAULT,
      &Flaeche_Zwei,
      0);

   Grafikkarte->CreateTexture(
      BSchirmbreite,
      BSchirmhoehe,
      1,
      D3DUSAGE_RENDERTARGET,
      D3DFMT_X8R8G8B8,
      D3DPOOL_DEFAULT,
      &Apparat_2,
      0);
   //Apparat_2->GetSurfaceLevel(0, &Flaeche_Zwei);
}



bool Spiel_Initialisieren(void)
{
   if(!Grafik.Init(hGriff,bWindowed))
   {
      return false;
   }

   Szene_Initialisieren(Grafik.GetDevice());

   return true;
}



void Aufraeumen(void)
{
   ENTLASSE(Hintergrund);
   ENTLASSE(Vordergrund);
   ENTLASSE(Flaeche_Eins);
   ENTLASSE(Flaeche_Zwei);

    //ReleasePpo(&Apparat_2);
   ENTLASSE(Apparat_2);

//   ENTLASSE (Grafikkarte);
}



HRESULT GetDisplayMode (D3DDISPLAYMODE *pMode);

HWND CreateMainWindow(HINSTANCE hInstance);

LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

int WINAPI WinMain(HINSTANCE hInstance,     
               HINSTANCE hPrevInstance, 
               LPSTR lpCmdLine,         
               int nCmdShow)             

   hGriff  = CreateMainWindow(hInstance);   
   hInst = hInstance;

   if(0 == hGriff)
   {
      MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
      return -1;
   }

   if( _getcwd( StatusPuffer, _MAX_PATH ) == NULL )
      perror( "_getcwd error" );
   else
   {
      sprintf(VerzeichnisPuffer, "%s", StatusPuffer);
   }
//   Grafikkarte = Grafik.GetDevice();

   Spiel_Initialisieren();

   //MSG msg = { NULL };

    Aufraeumen();

    _CrtDumpMemoryLeaks();

   return 0;
}



HWND CreateMainWindow(HINSTANCE hInstance)
{
   WNDCLASSEX wndClass =
   {
      sizeof(WNDCLASSEX),
         CS_CLASSDC | CS_OWNDC,
         MessageHandler,
         0L,
         0L,
         hInstance,
         LoadIcon(hInstance, MAKEINTRESOURCE( IDI_ICON1 )),
         LoadCursorFromFile("Mausi.cur"),       
         (HBRUSH)GetStockObject(NULL_BRUSH),
         NULL,
         "WindowClass",
         LoadIcon(hInstance, MAKEINTRESOURCE( IDI_ICON1 ))
   };

   RegisterClassEx(&wndClass);

   return  CreateWindowEx(NULL,
      "WindowClass",
      "MeinSpiel",
      WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP , 
      0, 0,
      BSchirmbreite, BSchirmhoehe,
      NULL,
      NULL,
      hInstance,
      NULL);
}


LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch(msg)
   {
       case WM_DESTROY:
      //Aufraeumen();
        //ENTLASSE (Grafikkarte);
        // _CrtDumpMemoryLeaks();
      KillTimer( hGriff, 0 );
      PostQuitMessage(0);
      return 0;
      break;
   }
   return DefWindowProc(hwnd, msg, wParam, lParam);
}


Wenn ich den >GetSurfaceLevel< weglasse bekomme ich die folgende Fehlermeldung:

Zitat:

Detected memory leaks!
Dumping objects ->
c:\programme\microsoft visual studio .net\vc7\include\crtdbg.h(674) : {43} normal block at 0x00D02E08, 32 bytes long.
Data: < f > B8 80 66 00 01 00 00 00 80 00 F3 00 00 00 00 00
c:\programme\microsoft visual studio .net\vc7\include\crtdbg.h(674) : {42} normal block at 0x00D02D18, 176 bytes long.
Data: < . > 01 00 00 00 80 00 F3 00 00 00 00 00 08 2E D0 00
c:\programme\microsoft visual studio .net\vc7\include\crtdbg.h(674) : {41} normal block at 0x00D02C88, 80 bytes long.
Data: < f > 84 80 66 00 01 00 00 00 CD 02 0A B7 00 00 00 00
Object dump complete.
Das Programm "[1292] VPPB.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.


Mit dem >GetSurfaceLevel< Aufruf sieht die Fehlermeldung so aus[/cpp]:

Zitat:

Detected memory leaks!
Dumping objects ->
c:\programme\microsoft visual studio .net\vc7\include\crtdbg.h(674) : {43} normal block at 0x00D02E08, 32 bytes long.
Data: < f > B8 80 66 00 01 00 00 00 80 00 F3 00 00 00 00 00
c:\programme\microsoft visual studio .net\vc7\include\crtdbg.h(674) : {42} normal block at 0x00D02D18, 176 bytes long.
Data: < . > 01 00 00 00 80 00 F3 00 00 00 00 00 08 2E D0 00
c:\programme\microsoft visual studio .net\vc7\include\crtdbg.h(674) : {41} normal block at 0x00D02C88, 80 bytes long.
Data: < f ~ E > 84 80 66 00 01 00 00 00 7E 06 0A 45 00 00 00 00
Object dump complete.
Direct3D9: (ERROR) :Memory still allocated! Alloc count = 73
Direct3D9: (ERROR) :Current Process (pid) = 000005ec
Direct3D9: (ERROR) :Memory Address: 00814fb4 lAllocID=1 dwSize=000047f8, ReturnAddr=00d732f6 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 0081b814 lAllocID=10 dwSize=00001950, ReturnAddr=00d6dc99 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00812ae4 lAllocID=11 dwSize=00000018, ReturnAddr=00d6dd39 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00812c3c lAllocID=12 dwSize=000002a0, ReturnAddr=00d72aa5 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 008123ec lAllocID=21 dwSize=000006bc, ReturnAddr=00d7ec8f (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00819abc lAllocID=23 dwSize=00001d1c, ReturnAddr=00d742eb (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00812f14 lAllocID=25 dwSize=00000018, ReturnAddr=00d7441c (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00f30064 lAllocID=27 dwSize=00002528, ReturnAddr=00d732f6 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 0081d19c lAllocID=28 dwSize=00000198, ReturnAddr=00d732f6 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00812b3c lAllocID=29 dwSize=00000030, ReturnAddr=00d732f6 (pid=000005ec)
Direct3D9: (ERROR) :Memory Address: 00f325cc lAllocID=30 dwSize=00001020, ReturnAddr=00d732f6 (pid=000005ec)
Direct3D9: (ERROR) :Total Memory Unfreed From Current Process = 48896 bytes
Das Programm "[1516] VPPB.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.07.2014, 23:52    Titel: Antworten mit Zitat

Hm, ich kann dir zwar bei deinem Problem nicht helfen, aber interessant zu sehen, das hier noch was gepostet wird Very Happy

Schönes Jahr 2014 an alle *g*
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum