[c++] Pointer/Delete

kickerxy123

Erfahrenes Mitglied
Guten Abend,

ich habe derzeit ein Problem, was zum Absturz führt.
Wenn ich zuerst die BackupFunktion, dann die restoreFunktion und dann die BackupFunktion aufrufe, dann stürzt das Programm ab.

Typ vom backupPointer: my*
C++:
vector<my> bla;
bla.push_back(...);
//backupPointer ist nun auf NULL initialisiert

my* copyMyWindow(my* pIn) 
{
	if(!pIn) return NULL;
	my* e = new my;
	*e = *pIn;
	return e;
}

void backupMyWindowInItself(vector<my>* pInOut)
{
	if(!pInOut) return;
	for(int i = 0; i < pInOut->size(); i++)
	{
		if((*pInOut)[i].backupPointer) delete (*pInOut)[i].backupPointer;
		(*pInOut)[i].backupPointer = copyMyWindow(&(*pInOut)[i]);  
	}	
}
void restoreMyWindowFromItself(vector<my>* pInOut)
{
	if(!pInOut) return;
	for(int i = 0; i < pInOut->size(); i++)
	{
		if(!((*pInOut)[i].backupPointer)) continue;
		(*pInOut)[i] = *((*pInOut)[i].backupPointer);
		delete (*pInOut)[i].backupPointer;
	}	
}

Ich hoffe, ihr könnt mir helfen.
Achso: Wenn ich die delete Befehle auskommentiere, dann läuft alles ohne Probleme! Ich dachte, dass ich mit meinen IF-Abfragen alles abfange, sodass ein delete kein Absturz verursachen kann. Scheinbar nicht - kann mir das wer erklären?

Danke und Gruß,
kickerxy
 
Zuletzt bearbeitet von einem Moderator:
Zuerst einmal: Können backup und restore mit einem NULL Parameter aufgerufen werden? Ansonsten würde ich den Parameter nicht als Pointer sondern als Referenz machen. Wäre schöner mit zu arbeiten.

Die Frage, die ich mir stelle: Hat backupPointer in Zeile 30 einen gültigen Wert?

Welchen Kompiler nutzt du denn? Wenn es Visual Studio ist, hast du dann schon einmal versucht dich in den Prozess einzuklinken und beim Crash zu schauen, wo diese passiert ist?
 
Hi.

Ein delete zerstört zwar das Objekt und gibt den Speicher wieder frei, aber es setzt nicht den Wert des Zeigers auf 0.

Dafür musst du schon selbst sorgen. (ist übrigens in jedem Fall gute Praxis)

Gruss
 
Hi.

Danke euch beiden. Zu Pointer/Referenz: da hat ja jeder eine andere Meinung. Ich persönlich finde Pointer übersichtlicher und komfortabler. Aber das ist ein anderes Thema ;)

Das Setzen auf NULL hat mir geholfen! Dadurch läuft die Sequenz nun vollständig fehlerfrei.

Gruß,
kickerxy
 
Zurück