ostringstream crasht im Konstruktor



  • Morgen. Ich habe heute eines meiner Projekte neu gebaut - und die ostrstreams, die ein Kollege darin vergessen hatte, durch ostringstreams ersetzt, weil ein seltsamer Fehler auftrat.

    Code:

    std::string timeStringWithSeconds( const LocalTime &Timestamp )
    {
      using namespace std;
      ostringstream ostr;  // Hier knallts
    
      ostr << timeString( Timestamp )                      << ":"
           << unsignedShortToString( Timestamp.second, 2 ) << ends;
      return ostr.str();
    }
    

    Der Fehler tritt auf in der STL Implementierung von ostringstream (sstream:426):

    explicit __CLR_OR_THIS_CALL basic_ostringstream(ios_base::openmode _Mode = ios_base::out)
    		: basic_ostream<_Elem, _Traits>(&_Stringbuffer),
    			_Stringbuffer(_Mode | ios_base::out)
    		{	// construct empty writable character buffer
    		}
    

    Exception:
    Unhandled exception at 0x7c812a5b in Analyse_d.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012efe0.

    Könnte mir bitte jemand dabei helfen, den Fehler einzugrenzen?



  • bad_alloc sagt dir, daß new ein mittleres Problem festgestellt hat (vermutlich im CTor des String-Buffer's). Und das Problem kommt ziemlich sicher NICHT von deinem Stringstream, sondern aus anderen Programmteilen (entweder du hast den RAM ausgeschöpft oder irgendwo über die Grenzen des reservierten Speichers hinausgeschrieben).



  • Habe ich nicht.

    Zum Zeitpunkt des Crashes:
    700MB / 1024 MB Speicher genutzt
    800MB / 1500 MB Auslagerungsdatei genutzt

    Allerdings kann ich das Problem jetzt genauer eingrenzen:

    10:59: Lotus Notes crasht (PANIC: Lokaler Heap ist voll)
    11:02: Ultraedit: *rumms* und weg
    11:05: Windows Explorer: Es steht nicht genug Speicher zur Verfügung.

    Auslastung ist fast nichts, wie eben auch.

    Applikationen stürzen auch nach Neustart des Rechners ab, ohne das mein Programm überhaupt gelaufen wäre (die einzige Änderung zum vorherigen RELEASE war das Ersetzen von ostrstream durch ostringstream).

    Es wundert mich schon, daß der IE noch läuft.

    Grade den Support angerufen. Da ist wohl ein neuer Rechner fällig...



  • BZW zumindest neuer Speicher.



  • Um so eine Absturzserie auszulösen, mußt du aber gut gezielt haben. (will heißen, du hast wohl mit deinem Programm wichtige Daten der Windows-Speicherverwaltung pulverisiert - und mit etwas Pech hat es diesen Müll vor dem Neustart ge"rettet")

    Eine mögliche Lösung deines Speicherproblems wäre wohl der abgesicherte Modus, aber dein Programm solltest du nochmal komplett überarbeiten, bevor du es wieder laufen lässt.

    PS: Was war das denn für ein "seltsamer Fehler"?



  • Problem gelöst.

    Speichercontroller hat die Biege gemacht und dabei auch die Speichermodule mitgenommen (das haben wir daran gemerkt, das die gerade getauschen Module auch gleich hin waren).

    Neue Hardware, neuer Speicher: Läuft fehlerfrei.

    Das war ja mal eine Aktion...


Anmelden zum Antworten