|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.07.2003, 09:33 Titel: Speicher freigeben |
|
|
Ich habe mir eine Klasse geschrieben, um Texturen zu verwalten:
Code: |
#include "TextureList.h"
#include "Utility.h"
CTextureList::CTextureList(void)
{
m_TextureCount = 0;
m_Textures = 0;
}
void CTextureList::AddTexture(char* FileName, LPDIRECT3DDEVICE9 lpDevice)
{
DebugString("Creating Texture:");
DebugString(FileName);
m_TextureCount++;
TEXTURE* NewTexture = new TEXTURE[m_TextureCount];
memcpy(NewTexture, m_Textures, sizeof(TEXTURE) * (m_TextureCount - 1));
delete[] m_Textures;
m_Textures = NewTexture;
NewTexture = 0;
m_Textures[m_TextureCount - 1].m_Name = new char[strlen(FileName)];
strcpy(m_Textures[m_TextureCount - 1].m_Name, FileName);
D3DXCreateTextureFromFile(lpDevice, FileName, &m_Textures[m_TextureCount - 1].m_Texture);
DebugString("Successful!");
}
LPDIRECT3DTEXTURE9 CTextureList::GetTexture(char* FileName)
{
for(unsigned int i = 0; i < m_TextureCount; i++)
{
if(CompareStrings(FileName, m_Textures[i].m_Name))
{
return m_Textures[i].m_Texture;
}
}
return 0;
}
CTextureList::~CTextureList(void)
{
for(unsigned int i = 0; i < m_TextureCount; i++)
{
delete[] m_Textures[i].m_Name;
m_Textures[i].m_Texture->Release();
}
delete[] m_Textures;
}
|
Wenn ich die beiden Zeilen,
delete[] m_Textures[i].m_Name;
m_Textures[i].m_Texture->Release();
wo der Speicher im Destruktor wieder freigegeben werden soll, ausführe, bekomme ich beim Programmende den Fehler:
Debug Error !
Program: <meine Exe-Datei>
DAMAGE: after Normal block (#438) at 0x00C21B00
(press Retry to debug the application)
[Abbrechen] [Wiederholen] [Ignorieren]
Wenn ich aber die Speicher-Freigabe auskommentiere, beendet sich das Programm ohne Probleme. Dann meldet _CrtDumpMemoryLeaks aber auch die Memory Leaks.
Der Rest des Codes funktioniert einwandfrei, die Texturen können verwendet werden.
Was bedeutet der Fehler und was tu ich dagegen |
|
Nach oben |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.07.2003, 09:46 Titel: |
|
|
Ich hab den Fehler gefunden: Ich hatte zu wenig Speicher reserviert:
m_Textures[m_TextureCount - 1].m_Name = new char[strlen(FileName)];
es muss heissen:
m_Textures[m_TextureCount - 1].m_Name = new char[strlen(FileName) + 1];
für das '\0' - Zeichen |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 27.07.2003, 11:51 Titel: |
|
|
Sowas passiert hin und wieder.
Ich würde aber beim Erstellen einen Integerwert zurückliefern, der eine ID der Textur darstellu und mit der man sehr viel schneller (z.B. per Index) auf die Textur zugreifen kann. Dann muß nicht jedesmal die "langsame" Stringvergleichsfunktion durchgeführt werden.
Man kann ja zusätzlich eine FUnktion schreiben, die die ID für einen Dateinamen liefert, wenn sich's nicht verhindern läßt. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
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
|