Eine funktion aufrufen auch wenn Programm abstürtzt

FSA

Erfahrenes Mitglied
Hallo
Ich bin ja gar kein Freund von Speicherleaks ;-]
Deswegen wollte ich nun etwas in mein Programm einbauen, genauer gesagt ein Funktion, die IMMMER aufgerufen wird wenn das Programm endet. Auch wenn es abstürtzt. Ist sowas möglich?
Ich habe schon an assert gedacht, aber ich kenne die Funktionsweise nicht ;)
Und Sry für den Dopelpost ;)
MfG
 
Also assert() ist der genau falsche Weg, denn assert() löst im Zweifelsfall das Signal ABRT aus.

Für dein Vorhaben musst du einen sog. Signal-Handler implementieren. Damit würde die Frage aufkommen, für welches Betriebssystem deine Applikation vorgesehen ist.

Und was haben Speicherlecks damit zu tun?

assert ist dafür gedacht, den Zustand einer Variablen zu prüfen. Du kannst damit folgendes machen:

C:
int main(int argc, char **argv)
{
  assert(argc >= 2); // Prüfen, ob die Anzahl der Argument ans Programm mindestens 2 ist, ansonsten wird das Programm hier mit SIG_ABRT (Linux) terminiert.
}
 
Öhm, sorry, habe mich etwas unklar ausgedrückt, natürlich ist auch interessant, mit welchem Compiler das ganze erledigt werden soll. GCC benötigt anderes Coding als VS bspw.
 
Hmm, ich sehe grad, das MS da sogar ein paar POSIX-Funktionen implementiert hat (das war nicht immer so):

http://msdn.microsoft.com/en-us/library/xdkz3x12(v=vs.71).aspx

Grundsätzlich funktioniert das so. Du registrierst einen Handler für das jeweilige Signal (z.B. SIGSEGV) und implementierst im Handler, was passieren soll, wenn dieses Signal auftritt. Im Falle von SIGSEGV ist z.b. eine Null-Pointer-Derefenzierung aufgetreten, man spricht auch von einem Segmentation Fault. Das sieht im Code dann so aus:

C:
#include <signal.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

// Signal-Handler für Segfaults
void segfault_handler(int sig)
{
  printf("Segmentation fault aufgetreten");
  getchar();
  // Hier könnte jetzt die Implementierung eines Stack-Trace-Dumps stehen

  exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{
  void **p = NULL;

  signal(SIGSEGV, segfault_handler);

  free(*p); // Hier müsste der Segfault dann auftreten

  return 0;
}
 
Zurück