> oder muss man den vielleicht gar nicht leeren
Es ist nicht notwendig, den Speicher zu leeren. Dazu muss man wissen, dass PureBasic das Ende von Strings im Speicher mit einer 0 markiert (
Chr(0)).
Experiment:
Allokiere 10 Bytes, Poke 9 Zeichen hinein.
PokeS() von PureBasic hängt automatisch eine 0 an, die 10 allokierte Bytes werden also vollständig ausgenutzt. Dann Poke 5 Zeichen. Das Poken von 5 Zeichen bewirkt, dass 6 Zeichen geschrieben werden (weil...? Ja genau! PB's null!)
Das sieht so aus:
Code: Alles auswählen
*buffer=AllocateMemory(10)
PokeS(*buffer, "ZYXWVUTSR")
PokeS(*bufer, "abcef")
Debug PeekS(*buffer)
Debug PeekS(*buffer+6)
Soll also nun ein gepoketer Text gelesen werden, geschieht das mit
PeekS(). Der Knackpunkt: Es werden nur alle Daten bis zum ersten auftretenden 0-Byte gelesen!
Zur Erinnerung: In unserem *buffer befinden sich 2 nullen. Eine an Stelle 10 von dem ersten PokeS. Die zweite null befindet sich ja an Stelle 6.
PeekS() liest also korrekt nur bis zur Stelle 6,
und das, obwohl noch "Müll" von einem älteren PokeS im Speicher steckt.
Diesen Müll kann man nachweisen, indem man zur Speicheradresse den Offset von 6 dazu addiert. Das bewirkt, dass
PeekS() erst an der 7. Stelle anfängt zu lesen und zwar wie gehabt bis zum nächsten Null-Byte. In diesem Fall allerdings wäre das nächste Null-Byte an 10. Stelle, denn es stammt ja noch vom 1. Poke-Versuch.
Fazit: Auch bei Netzwerkbuffern benötigt man kein ClearMemory. Denn
ReceiveNetworkData() tut nichts anderes, als Poken. Es benutzt (vermute ich) auch
PokeS() intern, was ein automatisches Anhängen eines 0-Bytes bewirkt. Liest du dann die Daten später noch mit
PeekS(), läuft alles korrekt ab (siehe oben).
Und selbst wenn es Probleme gibt:
ReceiveNetworkData() gibt die Anzahl an empfangenen Bytes zurück, diese Angabe kann man im Bedarfsfall auch noch benutzen.
Fazit: Auch beim normalen Poken+Peeken benötigt man nicht unbedingt ein ClearMemory.