| Zeile 17: | Zeile 17: | ||
== g++ == | == g++ == | ||
| − | < | + | <cpp> |
extern "C" void __cxa_pure_virtual() | extern "C" void __cxa_pure_virtual() | ||
{ | { | ||
| Zeile 23: | Zeile 23: | ||
// Programm/Kernel beenden | // Programm/Kernel beenden | ||
} | } | ||
| − | </ | + | </cpp> |
= globale/statische Objekte = | = globale/statische Objekte = | ||
| Zeile 45: | Zeile 45: | ||
Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen: | Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen: | ||
| + | <cpp> | ||
int __cxa_atexit(void (* f)(void *), void *p, void *d); | int __cxa_atexit(void (* f)(void *), void *p, void *d); | ||
| + | </cpp> | ||
f ist ein Funktionszeiger zu einem Destruktor, p der Parameter, der dem Destruktor übergeben werden soll und d ist das sog. "home DSO" (DSO = dynamic shared object). Diese Funktion sollte alle drei Parameter speichern und bei Erfolg 0, andernfalls nicht 0 zurückgeben. Wenn der Kernel/das Programm dann beendet wird, sollte man die Funktion | f ist ein Funktionszeiger zu einem Destruktor, p der Parameter, der dem Destruktor übergeben werden soll und d ist das sog. "home DSO" (DSO = dynamic shared object). Diese Funktion sollte alle drei Parameter speichern und bei Erfolg 0, andernfalls nicht 0 zurückgeben. Wenn der Kernel/das Programm dann beendet wird, sollte man die Funktion | ||
| + | <cpp> | ||
void __cxa_finalize(void *d); | void __cxa_finalize(void *d); | ||
| + | </cpp> | ||
mit d = 0 aufrufen, um alle mit __cxa_atexit registrierten Funktionen mit passenden Paramtern aufzurufen. Die registrierten Funktionen müssen in umgekehrter Reihenfolge aufgerugen werden. | mit d = 0 aufrufen, um alle mit __cxa_atexit registrierten Funktionen mit passenden Paramtern aufzurufen. Die registrierten Funktionen müssen in umgekehrter Reihenfolge aufgerugen werden. | ||
Außerdem muss man ein Symbol namens __dso_handle bereitstellen. Es wird allerdings nur die Adresse des Symbols verwendet um ein DSO zu identifizieren und um __cxa_atexit aufzurufen. | Außerdem muss man ein Symbol namens __dso_handle bereitstellen. Es wird allerdings nur die Adresse des Symbols verwendet um ein DSO zu identifizieren und um __cxa_atexit aufzurufen. | ||
| − | < | + | <cpp> |
extern "C" | extern "C" | ||
{ | { | ||
| Zeile 81: | Zeile 85: | ||
} | } | ||
| − | /* Zerstört momentan unabhängig von d alle Objekte */ | + | /* NOTE: Zerstört momentan unabhängig von d alle Objekte */ |
void __cxa_finalize(void *d) | void __cxa_finalize(void *d) | ||
{ | { | ||
| Zeile 91: | Zeile 95: | ||
} | } | ||
} | } | ||
| − | </ | + | </cpp> |
= new/delete = | = new/delete = | ||