crusader4
2007-11-15, 21:30:57
Hallo Forum!
In Sachen Programmierung bin ich ein Autodidakt, in letzter Zeit habe ich mich mir für ein Projekt C++ angeeignet. Nun sitze ich an einem Programm, in welchem häufig Objekte verschiedenen Typs angelegt und zerstört werden. Dabei werden die Objekte meist in einem Thread erstellt, in einen anderen Thread transferiert, bearbeitet und dort gelöscht (oder in einen weiteren Thread transferiert, der dann als Senke dient). Alle Methoden übergeben Zeiger auf die Objekte.
Nun soll diese Software nicht nur zwei Stunden, sondern Monate bis Jahre laufen (wie die Vorgängerversion das schon tat, ich habe aber sehr viele Veränderungen vorgenommen), so daß ich möglichst viele Speicherlecks entdecken muß. Bisher habe ich dazu in den Konstruktoren und Destruktoren der einzelnen Objektklassen eine Ausgabe eingebaut, die mir in eine Logdatei die Entstehung und Zerstörung eines Objekts mitschreibt. Damit kann ich zumindest prüfen, ob alle entstehenden Objekte auch entfernt werden.
Nun habe ich einige Fragen, die sich mit Abstürzen des Programms beschäftigen:
Gibt es eine Möglichkeit, die Gültigkeit eines Pointers zu testen? Bei einem delete auf ein Objekt wird selbiges zwar zerstört, aber der Zeiger auf das Objekt enthält immer noch den Wert. Hintergrund ist, das ich verhindern will, das ein Objekt mehrfach gelöscht wird. Eine Maßnahme die ich getroffen habe, ist Objekte nur an wenigen, zentralen Stellen zu löschen, um die Nachprüfbarkeit zu verbessern.
Weiterhin wollte ich den Zeigern nach einem delete den Wert NULL zuweisen, allerdings funktioniert folgendes nicht (wohl aufgrund der Parameterübergabe an die Funktion über den Stack):
#include <stdio.h>
#include "myclass.h"
void destruct(Cmyclass *p)
{
delete p;
p=NULL;
}
int main(void)
{
Cmyclass *myclass=new Cmyclass();
// do something
destruct(myclass);
printf("\Cmyclass-pointer=%p",myclass);
return 0;
}
Die Ausschrift ist nicht "Cmyclass-pointer=(nil)", sondern halt der Wert des Pointers. Gibt es eine Möglichkeit, die gewünschte Funktionalität zu implementieren? Das würde mir das Leben einfacher machen, weil ich dann in allen Funktionen einfach nur auf ein NULL-sein des Pointers prüfen müßte, bevor ich was damit anstelle.
Welche weiteren allgemeinen Tipps habt ihr für meine Vorhaben, um die Verfolgung zumindest zu erleichtern? Mir ist bewußt, das bei Programmen mit dynamischer Speicherverwaltung, und dann auch noch mit mehreren Threads viel Handarbeit gefragt ist und ich mir wohl den Weg jedes Objekttyps noch einmal ganz genau anschauen muß.
Im Voraus vielen Dank!
Grüße, Crusader
P.S.: Falls die Fragen zu trivial sind, kurz zur Erklärung: Ich bin zu diesem Projekt eher zufällig gekommen, und man ist auch mit mir zufrieden. Allerdings bin ich kein Informatiker und habe mir C++ nur durch den vorherigen Softwarebestand und einem Referenzbuch der Sprachelemente angeeignet. Daher sind meine theoretischen Kenntnisse nicht vorhanden, ich kenne nur die praktische Seite. Daher bin ich dankbar für Tipps, Howtos und Tutorials, weil ich mir Informationen recht schnell erarbeiten kann. Grundlagen der Computertechnik kenne ich auch, von Hause aus bin ich Elektrotechniker.
In Sachen Programmierung bin ich ein Autodidakt, in letzter Zeit habe ich mich mir für ein Projekt C++ angeeignet. Nun sitze ich an einem Programm, in welchem häufig Objekte verschiedenen Typs angelegt und zerstört werden. Dabei werden die Objekte meist in einem Thread erstellt, in einen anderen Thread transferiert, bearbeitet und dort gelöscht (oder in einen weiteren Thread transferiert, der dann als Senke dient). Alle Methoden übergeben Zeiger auf die Objekte.
Nun soll diese Software nicht nur zwei Stunden, sondern Monate bis Jahre laufen (wie die Vorgängerversion das schon tat, ich habe aber sehr viele Veränderungen vorgenommen), so daß ich möglichst viele Speicherlecks entdecken muß. Bisher habe ich dazu in den Konstruktoren und Destruktoren der einzelnen Objektklassen eine Ausgabe eingebaut, die mir in eine Logdatei die Entstehung und Zerstörung eines Objekts mitschreibt. Damit kann ich zumindest prüfen, ob alle entstehenden Objekte auch entfernt werden.
Nun habe ich einige Fragen, die sich mit Abstürzen des Programms beschäftigen:
Gibt es eine Möglichkeit, die Gültigkeit eines Pointers zu testen? Bei einem delete auf ein Objekt wird selbiges zwar zerstört, aber der Zeiger auf das Objekt enthält immer noch den Wert. Hintergrund ist, das ich verhindern will, das ein Objekt mehrfach gelöscht wird. Eine Maßnahme die ich getroffen habe, ist Objekte nur an wenigen, zentralen Stellen zu löschen, um die Nachprüfbarkeit zu verbessern.
Weiterhin wollte ich den Zeigern nach einem delete den Wert NULL zuweisen, allerdings funktioniert folgendes nicht (wohl aufgrund der Parameterübergabe an die Funktion über den Stack):
#include <stdio.h>
#include "myclass.h"
void destruct(Cmyclass *p)
{
delete p;
p=NULL;
}
int main(void)
{
Cmyclass *myclass=new Cmyclass();
// do something
destruct(myclass);
printf("\Cmyclass-pointer=%p",myclass);
return 0;
}
Die Ausschrift ist nicht "Cmyclass-pointer=(nil)", sondern halt der Wert des Pointers. Gibt es eine Möglichkeit, die gewünschte Funktionalität zu implementieren? Das würde mir das Leben einfacher machen, weil ich dann in allen Funktionen einfach nur auf ein NULL-sein des Pointers prüfen müßte, bevor ich was damit anstelle.
Welche weiteren allgemeinen Tipps habt ihr für meine Vorhaben, um die Verfolgung zumindest zu erleichtern? Mir ist bewußt, das bei Programmen mit dynamischer Speicherverwaltung, und dann auch noch mit mehreren Threads viel Handarbeit gefragt ist und ich mir wohl den Weg jedes Objekttyps noch einmal ganz genau anschauen muß.
Im Voraus vielen Dank!
Grüße, Crusader
P.S.: Falls die Fragen zu trivial sind, kurz zur Erklärung: Ich bin zu diesem Projekt eher zufällig gekommen, und man ist auch mit mir zufrieden. Allerdings bin ich kein Informatiker und habe mir C++ nur durch den vorherigen Softwarebestand und einem Referenzbuch der Sprachelemente angeeignet. Daher sind meine theoretischen Kenntnisse nicht vorhanden, ich kenne nur die praktische Seite. Daher bin ich dankbar für Tipps, Howtos und Tutorials, weil ich mir Informationen recht schnell erarbeiten kann. Grundlagen der Computertechnik kenne ich auch, von Hause aus bin ich Elektrotechniker.