nach string konvertieren in eigenem buffer in templates



  • berniebutt schrieb:

    Warum willst Du ofstream nicht verwenden und wozu eine eigene Klasse bemühen?

    damit ich statischen speicher habe.

    Was kann denn da schieflaufen??? 😮

    das allozieren des speichers.



  • speicherverlust schrieb:

    damit ich statischen speicher habe.

    Was bringt dir statischer Speicher? Ich hab das Gefühl, du bist dir nicht ganz im Klaren, was das bedeutet. Der statische/globale Speicherbereich existiert bis zum Programmende. Man kann ihn aber auch nicht einfach immer neu anfordern.

    Die statischen Variablen in einer Klasse benötigen nur einmal Speicherplatz und sind von jeder Instanz unabhängig, können also auch ohne Instanzierung der Klasse existieren. Das impliziert auch, dass sich mehrere Instanzen den Speicher teilen, also einander überschreiben - sicher nicht das, was du willst.

    speicherverlust schrieb:

    Was kann denn da schieflaufen??? 😮

    das allozieren des speichers.

    Wie gesagt, kannst du das abfangen. Und bei eigener Implementation auf dem Heap (mit new ) kannst du auf die Exception std::bad_alloc prüfen.


  • Mod

    Wie wäre es mit einer eigenen Ableitung von basic_streambuf? Die kannst du dann zur Initialisierung eines ganz normalen ostreams oder iostreams benutzen.



  • Nexus schrieb:

    Die C++-Streams werfen keine Exceptions, es sei denn, du willst es ausdrücklich so. Man kann sehr wohl erfahren, was schiefgelaufen ist, indem man die Fehlerflags ( good() , eof() , fail() , bad() ) überprüft.

    das ist nicht ausreichend. ist die festplatte voll? hat die logdatei die maximale dateigröße erreicht? einfach das programm abschmieren lassen ohne den benutzer wissen zu lassen warum, ist imo nicht akzeptabel. vor allem werden die fehler "trotz" neustarten des programmes wieder auftreten.
    zum testen kannst du ja mal ein maximales dateilimit von 50mb oder so etwas festlegen. dann versuchst du eine 51mb datei mit mozilla runterzuladen. der download wird komischerweise immer wieder bei 50mb abbrechen. und mozilla sagt dir nicht warum.



  • Nexus schrieb:

    Was bringt dir statischer Speicher? Ich hab das Gefühl, du bist dir nicht ganz im Klaren, was das bedeutet. Der statische/globale Speicherbereich existiert bis zum Programmende. Man kann ihn aber auch nicht einfach immer neu anfordern.

    richtig. genau das was ich brauche. ich muss keinen speicher anfordern, wenn meine anwendung das werfen eines bad_alloc loggen will.

    Die statischen Variablen in einer Klasse benötigen nur einmal Speicherplatz und sind von jeder Instanz unabhängig, können also auch ohne Instanzierung der Klasse existieren. Das impliziert auch, dass sich mehrere Instanzen den Speicher teilen, also einander überschreiben - sicher nicht das, was du willst.

    es wird immer nur ein LogStream objekt gleichzeitig geben.

    Wie gesagt, kannst du das abfangen. Und bei eigener Implementation auf dem Heap (mit new ) kannst du auf die Exception std::bad_alloc prüfen.

    bei einer ausnahme/fehler kann ich aber die nachricht nicht loggen.



  • camper schrieb:

    Wie wäre es mit einer eigenen Ableitung von basic_streambuf? Die kannst du dann zur Initialisierung eines ganz normalen ostreams oder iostreams benutzen.

    tolle idee. allerdings werde ich basic_stringbuf überschreiben. dann kann ich stringstreams und write/errno/etc verwenden.


  • Administrator

    Ehm sag mal, wofür ist diese Logsache? Könnte es sein, dass du etwas zu paranoid bist, was die Fehler angeht?
    Und was hat der folgende Satz mit dem Problem zu tun, welches du lösen möchtest?

    zum testen kannst du ja mal ein maximales dateilimit von 50mb oder so etwas festlegen. dann versuchst du eine 51mb datei mit mozilla runterzuladen. der download wird komischerweise immer wieder bei 50mb abbrechen. und mozilla sagt dir nicht warum.

    Das ist eine schlechte Fehlerbenachrichtigung. Dies kann aber mit ganze normalen Mitteln gelöst werden.

    richtig. genau das was ich brauche. ich muss keinen speicher anfordern, wenn meine anwendung das werfen eines bad_alloc loggen will.

    Man kann auch Stack-Speicher anfordern.

    bei einer ausnahme/fehler kann ich aber die nachricht nicht loggen.

    Wieso nicht? Schon mal was von try-catch gehört?

    Wie ich schon sagte, scheinst du mir eher ein wenig paranoid zu sein, als die Sache vernünftig anzugehen 🙂
    Hast du wirklich das Gefühl, dass deine Anwendung den ganzen RAM-Speicher aufbrauchen wird?

    Naja, aber camper hat dir jedenfalls einen guten Tipp gegeben, wie du sowas lösen könntest.

    Grüssli



  • Das ist eine schlechte Fehlerbenachrichtigung. Dies kann aber mit ganze normalen Mitteln gelöst werden.

    welchen? ofstream setzen errno afaik nicht.


  • Administrator

    speicherverlust schrieb:

    welchen? ofstream setzen errno afaik nicht.

    Du überprüfst, wie gross die Downloaddatei ist und wie gross das Maximum beträgt und wirfst dem User eine Warnung an den Kopf? Da muss nicht mal ein Fehlerflag gesetzt werden, das sollte, bevor der Download überhaupt startet, überprüft werden!
    In einem Log sollten nicht Bugs gelogt werden, die Bugs sollten vorher behoben werden! Es bringt dir die beste Logmöglichkeit nichts, wenn du als Programmierer nicht daran denkst, dass hier ein Fehler passieren könnte.

    Grüssli



  • ja, ne, das geht ja nicht. dann würde ja irgendwas bei mozilla funzen.


Anmelden zum Antworten