Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » std::bad_alloc ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ]
010
07.09.2006, 14:44 Uhr
virtual
Sexiest Bit alive
(Operator)


Du kannst einen eignen new handler schreiben und
1. Diesen mit set_new_handler registrieren
2. in diesem new Handler einen Breakpoint setzen

Dann solltest Du anhand des Stacktrace sehen, von wo aus die Speicheranforderung stammte.

Zum einbinden eines New-Handlers siehe: www.fun-soft.de/showtopic.php?threadid=15576
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
07.09.2006, 17:13 Uhr
flappinski



Guten Tag,
mit Eurer Hilfe bin ich dem Problem so langsam auf die Schliche oder zumindest deutlich näher gekommen: Ich benutze als Ausgabe ein Array von strings.
Für eine Stringvariable lässt er anscheinend als maximale Zeichenanzahl nur numeric_limits<int>::max()/4 zu. Ich denke, das hängt damit zusammen, dass string selber ein Container ist. Wenn ich jetzt ein Array aus strings definiere darf die Gesamtlänge des Array diese Länge nicht überschreiten.
Wie würdet ihr das Problem lösen? Soll ich alles gleich auf die Datei rausschreiben und vergessen? In einem Fall kein Problem, da werden die Ergebnisse nacheinander kommen. Im anderen Fall sind die Zeilen erst am Schluss fertig und können nicht vorher rausgechrieben werden...
Habt ihr da Ideen?
Danke,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
08.09.2006, 11:41 Uhr
flappinski



Hallo Ihr beiden,
leider habe ich es noch nicht ganz geschafft, das Problem zu lösen. Inzwischen habe ich den new_handler implementiert (übrigens fehlt in der Anleitung ein std:: vor dem set_new_handler, habe ich ein bisschen dran geknabbert). Wie kann ich jetzt eine Stacktrace anschauen? Ehrlich gesagt wiss ich gar nicht genau, was das ist.
Mit der Zeilennummer bin ich leider auch nicht weitergekommen, da __LINE__ ja nur die Zeilennummer ausgibt, in der __LINE__ steht, und nicht von wo aus die exception geworfen wurde.
Ich wäre Euch über weitere Hife sehr dankbar, vielen Dank im Vorraus,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
08.09.2006, 12:16 Uhr
Blubber2063



Mit der Zeilennummer erreichst du doch das du den Ort kennst der die Exception schmeisst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
08.09.2006, 13:06 Uhr
flappinski



naja, ich schmeisse ja nicht die exception, sondern ich fange einfach alle mit catch(...), wie bekomme ich dann die Zeileinummer, von wo die Exception kam? Mache ich einen Denkfehler hier? Wenn ich eine konkrete Exception selber werfe, kenne ich die Problemzone doch schon, oder? Kann ich denn mit catch(...) die Zeilennummer ausgegeben bekommen? Danke,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
08.09.2006, 13:17 Uhr
flappinski



gut, ich habe verstanden, dass ich auch direkt so abfangen kann...

catch (const std::bad_alloc& ex)
{
std::cout << ex.what() << std::endl;
...
}



es.what() bringt dann den altbekannten <St9bad_alloc> zum Vorschein. Gibt es dann auch noch eine Funktion, die Zeilennummer dieser Exception beinhaltet?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
08.09.2006, 13:23 Uhr
Blubber2063



Wüsste nicht die Exception das wissen sollte, aber du solltest ja auch in dem catch Block std::cerr << "Zeile :"<< Zeilennummer. Tippen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
08.09.2006, 14:05 Uhr
flappinski



ich verstehe das nicht, sorry:
wenn ich folgendes in den catch-block schreibe, erhalte ich exact die Zeilennummer, in der diese Anweisung steht. Aber ich bin doch vielmehr an der zeilennummer interessiert, wo die Exception geworfen wurde, oder?


std::cerr << __LINE__ << "\t of \t" << __FILE__ << std::endl;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
08.09.2006, 14:22 Uhr
Blubber2063



Naja wenn du die allozierende Anweisung mit Exception Handling kapselst, dann weisst du doch genau welche Anweisung sie geworfen hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
08.09.2006, 15:10 Uhr
flappinski



noe, nicht ganz, ich habe einfach die ganze Schleife gekapselt, diese ist jedoch sehr gross (ein paar hundert Zeilen) und darin passiert ziemlich viel und ausserdem muss sie erst mal 180000 mal durchlaufen werden, bis das Problem auftritt. Ich denke, ich muss da doch anders ran: entweder jede allozierende Anweidung kapseln (also jeden push_back, new, etc., oder?) oder mich doch mal mit gdb auseinandersetzen. Habe ihr eine andere Empfehlung als gdb?
Grüsse,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: