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 ]
030
11.09.2006, 17:12 Uhr
flappinski



habe ich gerade getan (sogar bevor von Dir der letzte Thread kam) und siehe da: tatsächlich ein Speicherleck! und zwar in der Hauptschleife, die so an die 5 Milliarden mal durchlaufen wird. Ich lasse gerade laufen und bin sehr gespannt!!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
11.09.2006, 18:13 Uhr
flappinski



YEAHYEAHYEAH!!!!
Endlich geschafft. Vielen Dank, Virtual, ich werde auch Deine anderen Tips zu herzen nehmen, aber der absolute Super-Tip war valgrind. Das kannte ich noch gar nicht! Jetzt läuft alles wie am Schnürchen. Bis ich alles nach Deinen anderen Tips umgearbeitet habe, wird es noch lange dauern, aber das ist zumindest nicht so dringlich!!!
Aprospros, der Tip mit


C++:
C++:
std::copy(std::istream_iterator<char>(temp_stream),
    std::istream_iterator<char>(),
    std::ostream_iterator<char>(Out));



funktioniert irgendwie nicht, dabei geht einerseits mein Stream verloren - gut das hast Du bestimmt beabsichtigt -, aber auch die ganzen Zeilentrenner und Tabstopps, etc gehen irgendwie verloren. Ist da was dran?
Sonst vielen Dank und noch eine schöne Woche!
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
11.09.2006, 21:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Du musst das Skip-Whitespace-Flag bei temp_stream löschen (jedenfalls vermute ich das mal):

C++:
#include <iomanip>

temp_stream>>std::noskipws;
std::copy ...


--
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
033
12.09.2006, 08:46 Uhr
flappinski



Hi Virtual,
ja, das hat das Problem mit dem "Zusammenschnurren" gleich gelöst, dennoch es bleibt das "Verschwinden". Ich kann das jetzt auch näher präzisieren: Wenn ich dein copy benutze, kann ich danach nichts mehr in den Stream reinschreiben. Konkret als konzentriertes Beispiel:


C++:
    log_stream << "erster Text\n";
    log_stream>>std::noskipws;
    std::copy(std::istream_iterator<char>(log_stream),
             std::istream_iterator<char>(),
             std::ostream_iterator<char>(cout));
    
    log_stream << "kommt da was dazu, oder nicht?\n";
    std::copy(std::istream_iterator<char>(log_stream),
             std::istream_iterator<char>(),
             std::ostream_iterator<char>(cout));



ergibt nur den "erster Text" -Text

Was mache ich falsch?
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
034
12.09.2006, 09:26 Uhr
virtual
Sexiest Bit alive
(Operator)


Also ich mach zur Zeit wenig aktiv mit C++, habe daher auch keinen Compiler, um Sachen auszuprobieren. Aber:

Durch das 1. copy wird log_stream bis zum bitteren Ende Kopiert. Das heißt konkret, daß verm. das EOF Bit gesetzt wird, so daß jeder weitere Schreibzugriff fehlschlägt. Ich würde also zwischen 1. copy and 2. op<< ein log_stream.clear(0) spendieren.
--
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
035
12.09.2006, 10:08 Uhr
flappinski



Lieber Virtual,
danke, jetzt läuft`s, nur musste ich clear() verwenden, clear(0) funktionierte nicht. Ich habe immer versucht mit str("") den stream zu löschen, das hat aber nicht hingehauen....
Try and Error ist halt echt mühsam,
Schöne Grüsse,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
036
12.09.2006, 10:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Jetzt habe ich mir doch mal eine UNIX Kiste gekrallt und eine C++ Compiler angeworfen...

Du hast so noch immer ein Problem, denke ich. Dieses Einfache Programm sei gegeben:

C++:
#include <sstream>
#include <iostream>
#include <iterator>

int main() {
        std::stringstream o;
        o<<"Hallo, Welt"<<std::endl;
        std::copy(std::istream_iterator<char>(o), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));
        o.clear();
        std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;

        o<<"Hallo, Welt"<<std::endl;
        std::copy(std::istream_iterator<char>(o), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));
        o.clear();
        std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;

        // DER IST WICHTIG:
        o.str("");

        o<<"Hallo, Welt"<<std::endl;
        std::copy(std::istream_iterator<char>(o), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));
        o.clear();
        std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;
}



Was gemacht wird, ist ein paar mal hintereinander den Stringstream nach std::cout zu kopieren. das clear ist schon eingebaut.
Zu beachten sind die Zeilen:

C++:
std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;


Wie Du anhand der Ausgabe siehst, erhöhen sich die Dateizeiger von o mit Jeder ausgabe. Dh letztlich bewirkt das copy lediglich, daß ein Teil on o jeweils rausgeschrieben wird; der rausgeschriebene Teil bleibt aber stets im Speicher zurück. Dh wenn Du auf diese Art deine 5 GB Stückweise wegschreibst, hast Du eigentlich dennoch irgendwo 5 GB im Speicher. Ich würde also generell hinter dem std::copy die beiden Zeilen:

C++:
stream.clear();
stream.str("");


spendieren. Die zweite Zeile setzt den Stream auf den Inhalt "" zurück.
--
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
037
12.09.2006, 11:01 Uhr
flappinski



Hi Virtual,
per Zufall hatte ich den str("") noch von vorher drin. Aber ich habe Deine Ausführungen auch noch mit einem mit einer Längenabrfage des Streams überprüft und die Länge nimmt tatsächlich auch zu.
Der Problem könnt dann auch später noch auftauchen, wenn der Stream sich nicht weiter füllt, denn bei einer gewissen Länge (INTMAX Zeichen) wird er nicht mehr grösser...
Danke auf alle Fälle für Deine Bemühungen, schön, Dich mal wieder mit C++ "angefixt" zu haben...
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
038
12.09.2006, 11:30 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von flappinski:

Danke auf alle Fälle für Deine Bemühungen, schön, Dich mal wieder mit C++ "angefixt" zu haben...


Gern geschehen, aber mit dem anfixen wird nix: wenn ich mir Die von dir beschriebenen Probleme anschaue, dann weiß ich schon, warum ich lange kein C++ mehr gemacht habe...
--
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
039
12.09.2006, 11:59 Uhr
flappinski



darf ich fragen, was denn so Deine "Lieblingssprache" so ist? Wo hat man denn deutlich weniger Fehlerquellen (ich denke, das ist leicht zu beantworten) und wo bekommt man gleichzeitig ähnlich hohe Performance? Du siehst ja, wie laienhaft ich mich anstelle, es ist nicht zu spät die Sprache zu wechseln, allerdings spielt die Performance eine wirklich massiv grosse Rolle....
 
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: