TMemoryStream write schreibt scheinbar nicht wirklich



  • Hi,

    ich arbeite gerade mit einem memorystream. Leider verhält der sich nicht wie ich erwartet habe.Ich schreibe dem stream munter daten rein und lösche sie natürlich danach. Genau hier ist aber das Prob, sobald ich die Daten lösche, verliert auch der Stream die Daten. Flush gibts leider nicht für ms ?-)



  • mcam77 schrieb:

    Ich schreibe dem stream munter daten rein

    Schön für Dich...

    mcam77 schrieb:

    ... und lösche sie natürlich danach.

    Du schreibst IN DEN STREAM und danach LÖSCHST DU DIE DATEN...

    mcam77 schrieb:

    ... sobald ich die Daten lösche, verliert auch der Stream die Daten.

    ???
    Sollte man nicht erwarten, dass Daten nach dem Löschen weg sind...

    Gruss
    Frank

    PS: gelöschte Dateien sind ja auch (scheinbar) weg...



  • natürlich meinte ich das ich die zeiger lösche die Daten temporär enthalten haben.

    also PseudoCode

    int *i=new int;
    i=5;
    schreibe i in den stream;
    delete i;

    m.M. nach sollten dann die Daten im Stream erhalten bleiben, tun sie aber nicht!



  • Hallo

    Und wie schreibst du i in den Stream? Das ist nämlich die entscheidende Frage.

    bis bald
    akari



  • memStrm->Write((const char*)&tbHeader,sizeof(TarballHeader));
    


  • Hallo

    Syntaktisch ist das schon richtig. Aber das geht nur bei reinen POD-Typen (Plain old datatyp, also int in allen Variantem, float in allen Varianten, C-Style array, enum und structs die nur aus diesen Typen bestehen).
    Wenn dein tbHeader aber eine eigene Klasse ist, die auch nur einen einzigen Zeiger/Referenz als Member hat, ist das nicht mehr möglich. Dazu reicht schon die Verwendung von String. Dann bekommst du nur die aktuellen Adressen von den Speicherbereichen in den Stream, aber nicht die Daten hinter den Adressen. Wenn du dann die Original-Instanz gelöscht hast, sind die Adressen in den Stream ungültig.

    Du must für deine Klasse eine spezielle Funktion schreiben, die auch die Speicherbereiche hinter den Zeigern mit in den Stream schreibt. Und beim Lesen aus dem Stream must du mit einer weiteren Funktion die Speicherbereiche wiederherstellen. Leider bietet C++ dafür noch keine direkte Hilfe wie Java oder C#, aber unter dem Stichwort Serialisation solltest du hier im Forum und auch sonst im Internet mögliche Umsetzungen finden.

    bis bald
    akari



  • thx akari,

    hast mir wiedermal sehr weitergeholfen! Immer wieder nice von deinem echt fundiertem Wissen zu lesen!

    Ich werde mir die Sache mit der Serialisierung endlich mal zu Gemüte führen, habe mich lange genug darum gedrückt 😉

    lg


Log in to reply