C++ — Änderungen 2277 → 2296

Zeile 17: Zeile 17:
  
 
== g++ ==
 
== g++ ==
−
<pre>
+
<cpp>
 
extern "C" void __cxa_pure_virtual()
 
extern "C" void __cxa_pure_virtual()
 
{
 
{
Zeile 23: Zeile 23:
 
     // Programm/Kernel beenden
 
     // Programm/Kernel beenden
 
}
 
}
−
</pre>
+
</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.
  
−
<pre>
+
<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:
 
         }
 
         }
 
}
 
}
−
</pre>
+
</cpp>
  
 
= new/delete =
 
= new/delete =