|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 25.03.2014, 17:42 Titel: Memory leaks im Zusammenhang mit GetSurfaceLevel |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.07.2014, 23:52 Titel: |
|
|
Hm, ich kann dir zwar bei deinem Problem nicht helfen, aber interessant zu sehen, das hier noch was gepostet wird
Schönes Jahr 2014 an alle *g* _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|
|
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
|