Ich habe ein Programm, das mehrere heuristische Suchalgorithmen und mehrere Domänen implementiert, entworfen, um die verschiedenen Algorithmen experimentell zu bewerten. Das Programm ist in C++ geschrieben, mit der GNU-Toolchain erstellt und läuft auf einem 64-Bit-Ubuntu-System. Wenn ich meine Experimente durchführe, verwende ich den Befehl ulimit
von bash, um die Menge an virtuellem Speicher zu begrenzen, den der Prozess verwenden kann, so dass mein Testsystem nicht mit dem Austausch beginnt.Warum segmentiert mein Programm gelegentlich, wenn nicht genügend Arbeitsspeicher vorhanden ist, anstatt std :: bad_alloc zu werfen?
Bestimmte Algorithmen/Test-Instanz-Kombinationen treffen auf das von mir definierte Speicherlimit. In den meisten Fällen löst das Programm eine std :: bad_alloc-Ausnahme aus, die vom Standardhandler ausgegeben wird. An diesem Punkt wird das Programm beendet. Gelegentlich, anstatt dass dies geschieht, segmentiert das Programm einfach.
Warum segmentiert mein Programm gelegentlich, wenn nicht genügend Arbeitsspeicher vorhanden ist, anstatt einen unbehandelten std :: bad_alloc zu melden und zu beenden?
segfault kann nicht nur verursacht werden, weil Sie Limit des Speichers – Andrey
Ich bin mir ziemlich bewusst. In den Fällen, in denen ich einen Segfault gesehen habe, verwendet der Prozess Speichermengen in der Nähe des von mir angegebenen Grenzwerts. Ich bin ziemlich zuversichtlich, dass die Segfaults, die ich sah, nicht auf Fehler in meinem Code zurückzuführen waren. –
Haben Sie einen einfachen Lauf in GDB (gut einige von ihnen) in Betracht gezogen, um zu sehen, welcher Teil des Codes seg-Fehler? – Shiroko