NicTheQuick hat geschrieben: ↑24.01.2022 00:00
Cool! Aber denk dran. UTF8 erzeugt einen Speicherbereich, den du wieder freigeben solltest, sonst hast du ein Speicherleck.
Da stellt sich doch die Frage wie die Funktionen mit _ Suffix (z.B. popen_) intern deklariert ist.
Muss man UTF8 - String-Zeiger wirklich wieder "manuell" freigeben?
Diese Zeiger belegen z.B. 32 Byte und diese Zeiger weisen doch auf eine konstante Zeichenkette.
Aus: "Dies ist ein Text" kann doch z.B. genau die maximale Speichergröße für UTF8 ermittelt werden, oder?
Die Funktion "fgets" birgt aber eine gewisse Gefahr.
NicTheQuick hat geschrieben: ↑24.01.2022 21:03
Ja, muss man mit FreeMemory. Siehe Hilfe
Ach Mist!
Ich glaube da baue ich durch die UTF8() - Verwendung immer mehr neue zusätzliche "Variablen" in meine Programme ein.
Und alle diese "großen" Variablen werden bis zum bitteren Ende niemals freigegen.
Die Verwendung "tausender" globaler Variablen dürfte damit auch eine ähnliche unschöne Angewohnheit sein.
"pout.s{100}" reserviert dir 200 Bytes, da Purebasic immer Unicode nutzt.
"AllocateMemory(100)" reserviert wirklich nur 100 Bytes.
Prinzipiell kannst du beides verwenden, aber du könntest Probleme habe, wenn wirklich mal ein Nullbyte zurückkommt. Ich persönlich würde wahrscheinlich mit AllocateMemory() arbeiten. Maximal noch mit sowas wie "Dim pout.a(99)", was auch 100 Bytes wären. Aber das ist dann Geschmackssache.
Mit pout{Anzahl_Zeichen} wäre ich aber beim Einlesen von UTF8-Zeichenketten auf der sichereren Seite.
Außerdem brauche ich dann keine Multiplikation (mit z.B. 2) bzw. eine Angabe in Byte (die groß genug ist) bei AllocateMemory und bleibe bei der Einheit "Zeichen" und nicht Byte.
Einerseits können UTF-8-Zeichen bis zu 4 Byte einnehmen, aber auf der anderen Seite erwartet fget() als zweiten Parameter nicht die Anzahl Zeichen, sondern die Anzahl Bytes. Das sagt mir zumindest die man page dazu.