C++ Memory Leak beseitigen

nchristoph

Erfahrenes Mitglied
Ich bin gerade dabei, mir einen Modelviewer zu basteln.

Funktioniert ja so weit so gut, nur wenn ich den Viewer auf 0 zurücksetze, krieg ich eine exception.

Ich vermute, es liegt an meinem neuen Code zum Model setzen. Mit dem alten funktioniert es ohne crash, dafür langsamer als mit dem neuen.

C++:
void CVGUIModel::ResetModel()
{
	model = new cl_entity_t;
}
void CVGUIModel::KillModel()
{
	delete model;
}
void CVGUIModel::SetModel(char *name)
{
	cl_entity_t *player;
	// Load it up with some bogus data
	player = gEngfuncs.GetLocalPlayer();
	if ( !player )
		return;

	int m_i;

	char file[64];

	sprintf(file,"models/player/%s/%s.mdl",name,name);

	*model = *player;
	model->model = gEngfuncs.CL_LoadModel( file, &m_i );
	model->origin  = Vector(0,0,-6);
	model->index = 10000;
	model->curstate.modelindex = m_i;
	SetSequence("idle");
}

void CVGUIModel::SetSequence(char *name)
{
	model->curstate.sequence = LookUpSequence(model,name);
	model->prevstate.sequence = model->curstate.sequence;
	model->baseline.sequence = model->curstate.sequence;
}
Durchs debuggen bin ich nicht wirklich schlauer geworden, ich crashe immer in die Render dll der Engine. Meine Vermutung ist, das ich in der KillModel oder ResetModel Funktion nen Bock geschossen habe.
 
Funktioniert ja so weit so gut, nur wenn ich den Viewer auf 0 zurücksetze, krieg ich eine exception.
Verrätst du uns auch, welche Exception geworfen wird?

Ich vermute, es liegt an meinem neuen Code zum Model setzen. Mit dem alten funktioniert es ohne crash, dafür langsamer als mit dem neuen.
Nützlich wäre jetzt hier ein Vergleich zwischen alt und neu. Was genau hast du geändert?

Grüße, Matthias
 
Ok hier einmal die Exception

First-chance exception at 0x036fdbe7 in hl.exe: 0xC0000005: Access violation reading location 0x00000044.

Der Unterschied zwischen dem alten und neuen Code ist der, das ich die Resetmodel und Killmodel funktion hinzugefügt habe.

Ein paar kleinere Tweaks in der Setmodel hab ich zwar auch eingefügt, welche aber nicht wirklich ins Gewicht fallen sollten. Ich poste die alte Funktion trotzdem.

C++:
void CVGUIModel::SetModel()
{
	cl_entity_t *player;
	// Load it up with some bogus data
	player = gEngfuncs.GetLocalPlayer();
	if ( !player )
		return;

	int m_i;

	char file;

        if(g_iPlayerclass == PC_STEVE)
        {
               file = "models/player/steve/steve.mdl";
        }
        if(g_iPlayerclass == PC_FRANK)
        {
                file = "models/player/frank/frank.mdl";
        }
	*model = *player;
	model->model = gEngfuncs.CL_LoadModel( file, &m_i );
	model->origin  = Vector(0,0,-6);
	model->index = 10000;
	model->curstate.modelindex = m_i;
        model->sequence = "idle";
        model->gaitsequence = "NULL";
}

Hat funktioniert, aber wie gesagt sehr langsam.

Da ich aber über das GUI die Animation ändern will, hab ich die Animation in eine Funktion ausgelagert und den Modelnamen in die Setmodel Funktion gepackt daher auch jetzt SetModel(char *name) und SetSequence(char *name).
 
Hi.

Reset:
C++:
delete model;
model = new cl_entity_t;
Kill
C++:
delete model;
model = 0;
Über eine first-chance exception brauchst du dir eigentlich keine Gedanken machen.

Gruß
 
Sry das ich so spät antworte.

Ich habs jetzt komplett umgeschrieben, und ich glaube, ich hab jetzt beim Model alle Leaks beseitigt, zumindest crasht er nicht mehr pausenlos.

Ne andere Frage: Wie kann ich mdmp Dateien öffnen und zum debuggen verwenden?

Wenn Steam crashed, generiert er eine minidump Datei im Hauptverzeichnis, aber alles was ich gefunden habe bei Google über diese Dateien endet für mich in einer Sackgasse.
 
Zurück