JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Speicher freigeben

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 27.07.2003, 09:33    Titel: Speicher freigeben Antworten mit Zitat

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 Question Question Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 27.07.2003, 09:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.07.2003, 11:51    Titel: Antworten mit Zitat

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
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 -> Entwicklung 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