SegFault II.
02-03-2002, 11:48
Hallo!
Hat hier jemand Erfahrung mit Exceptions in C++?
Ich habe nämlich folgendes Problem:
In einer (selbstgeschriebenen) Bibliothek habe ich
eine Struktur oSDL_Error:
struct oSDL_Error{
oSDL_ErrorType type; // enum oSDL_ErrorType {...}
std::string error;
void* details;
oSDL_Error(oSDL_ErrorType t, std::string e, void* d){
type = t;
error = e;
details = d;
}
};
In der Bibliothek verwende ich diese Struktur zum Erkennen
und Umschiffen von Fehlern.
Zum Beispiel wird bei einem Druck auf Esc dies aufgerufen:
// anderer Code
throw(oSDL_Error(OSDL_QUIT, "oSDL_Keyboard::pressed(SDLKey): Key 'Esc' pressed", 0));
An anderer Stelle hab ich dann
try{
// irgendwas
}
catch(oSDL_Error error){
// mach was
}
stehen.
Wenn ich jetzt ein Programm, das ich in der Entwicklungsumgebung(KDevelop)
zusammen mit der Bibliothek schreibe aufrufe, gibt es keinerlei Probleme damit.
Aber wenn ich irgendein Programm (auch das, aus der Entwicklungsumgebung) außerhalb
des oSDL-Projekts compiliere und gegen die Bibliothek linke, gibt es immer einen
Speicherzugriffsfehler, wenn der Fehler "geworfen" wird.
Beim debuggen stellte ich bereits fest, das dies nach dem Zuweisen der Daten zu der
Struktur geschieht.
Also wird die oSDL_Error(oSDL_ErrorType, std::string, void*)-Funktion fehlerfrei
durchlaufen.
Aber in dem daruffolgenden Schritt, die neu geschaffene Struktur zu "werfen" gibt es
den Speicherzugriffsfehler und das Programm, das gegen die Bibliothek gelinkt ist,
stürzt ab.
Der Fehler tritt leider nicht nur bei der Überprüfung auf Esc auf, sondern an jeder
beliebigen Stelle, bei jedem bisher getesteten Parametern.
Ich habe dies unter Linux (Gcc 2.95.3) und Windows (Borland C++-Builder 4) getestet.
Bei beiden Compilern/Systemen tritt der selbe Fehler auf.
Kann mir jemand verraten, wo das Problem liegt?
Mach ich was falsch beim "Werfen"?
Hat hier jemand Erfahrung mit Exceptions in C++?
Ich habe nämlich folgendes Problem:
In einer (selbstgeschriebenen) Bibliothek habe ich
eine Struktur oSDL_Error:
struct oSDL_Error{
oSDL_ErrorType type; // enum oSDL_ErrorType {...}
std::string error;
void* details;
oSDL_Error(oSDL_ErrorType t, std::string e, void* d){
type = t;
error = e;
details = d;
}
};
In der Bibliothek verwende ich diese Struktur zum Erkennen
und Umschiffen von Fehlern.
Zum Beispiel wird bei einem Druck auf Esc dies aufgerufen:
// anderer Code
throw(oSDL_Error(OSDL_QUIT, "oSDL_Keyboard::pressed(SDLKey): Key 'Esc' pressed", 0));
An anderer Stelle hab ich dann
try{
// irgendwas
}
catch(oSDL_Error error){
// mach was
}
stehen.
Wenn ich jetzt ein Programm, das ich in der Entwicklungsumgebung(KDevelop)
zusammen mit der Bibliothek schreibe aufrufe, gibt es keinerlei Probleme damit.
Aber wenn ich irgendein Programm (auch das, aus der Entwicklungsumgebung) außerhalb
des oSDL-Projekts compiliere und gegen die Bibliothek linke, gibt es immer einen
Speicherzugriffsfehler, wenn der Fehler "geworfen" wird.
Beim debuggen stellte ich bereits fest, das dies nach dem Zuweisen der Daten zu der
Struktur geschieht.
Also wird die oSDL_Error(oSDL_ErrorType, std::string, void*)-Funktion fehlerfrei
durchlaufen.
Aber in dem daruffolgenden Schritt, die neu geschaffene Struktur zu "werfen" gibt es
den Speicherzugriffsfehler und das Programm, das gegen die Bibliothek gelinkt ist,
stürzt ab.
Der Fehler tritt leider nicht nur bei der Überprüfung auf Esc auf, sondern an jeder
beliebigen Stelle, bei jedem bisher getesteten Parametern.
Ich habe dies unter Linux (Gcc 2.95.3) und Windows (Borland C++-Builder 4) getestet.
Bei beiden Compilern/Systemen tritt der selbe Fehler auf.
Kann mir jemand verraten, wo das Problem liegt?
Mach ich was falsch beim "Werfen"?