Moin moin, Am Saturday 27 December 2003 19:55 schrieb Bernhard Walle:
On Sat, 27 Dec 2003 at 19:33 (+0100), Andre Heine wrote:
Am Saturday 27 December 2003 14:25 schrieb Bernhard Walle:
On Sat, 27 Dec 2003 at 14:10 (+0100), Andre Heine wrote:
Am Saturday 27 December 2003 13:42 schrieb Bernhard Walle:
[...]
Bei Rattis Problem geht es um einen SIGSEGV. Da wird über Perl auf C-Code zugegriffen und dieser Code produziert einen echten Speicher- zugriffsfehler. Das Betriebssystem schickt an den Prozess ein SIGSEGV Signal mit der Aufforderung, dass das Programm beendet wird.
Ok. Diesen Umstand hab' ich übersehen ;( Ich dachte an ein Java Programm von der Arbeit, wo ich externe Programme, Skripte, etc starten in der shell starten musste. Einige Programme haben sich mit Segfault beendet, meins musste aber weiterlaufen... Das hat funktioniert mit try & catch, dachte ich bis heute jedenfalls ;((
In C++ greift man auf einen Speicherbereich zu, der vom Betriebssystem einem anderen Prozess zugeordnet wurde. Dies wird dann vom Betriebs- system mit einem SIGSEGV abgelehnt. Das Programm befindet sich dadurch in einem potentiell undefinierten Zustand, kann noch Aufräumarbeiten durchführen und hat sich dann zu beenden. Standardmäßig beendet es sich umgehend. Eine Ausnahme wird da an keiner Stelle geworfen.
Das aufrufende Programm wird ja nicht unbedingt mitgekillt. [...]
Ist den ein "Fehlschlag bei der Speicherbeschaffung" kein falscher Zugriff auf den Speicher (oder ist damit nur gemeint, das zuwenig Speicher vorhanden ist, vermutlich ja *g*).
Nein. Der new-Operator kann scheitern, wenn kein Speicher mehr da ist. Dann wirft dieser Operator eine std::bad_alloc-Ausnahme. Wenn Du die Ausnahme abfängst und trotzdem weitermachst und auf den nicht beschafften Speicher zugreifst, bekommst Du wieder einen SIGSEGV, den Du nicht mehr abfangen kannst (außer über Signal handling).
Genau, darum werden ja "Ausnahmen geworfen". Man soll nicht mehr auf diese Variable zugreifen. Ciao Andre