MemFree und C/WStrings

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Blacal

Betreff: MemFree und C/WStrings

BeitragMo, Apr 17, 2006 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus

Mal ne ganz blöde Frage: Wie legt man C- oder WStrings Frei?
Denn was mir aufgefallen ist, ist, dass MemFree nur 1 Parameter hat, und zwar den Pointer. Also frag ich mich, was eigendlich in folgendem Code freigelegt wird:

Code: [AUSKLAPPEN]

Local cStr:Short Ptr

cStr=irgendeine_c_funktion();
...
MemFree cStr



Denn wenn der den ganzen String dabei löscht, woher weiß der, wie lang der String ist? Für den ist das ja einfach nur ein Short Pointer. Gut, in dem fall isser Null terminiert (oder wie man das auch immer sagt), aber das is ja auch nicht immer so.

Mfg Blacal

Blacal

BeitragDi, Apr 18, 2006 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus

So, Frage hat sich zumindest schomal teilweise erledigt.
Der scheint zu erkennen, wieviel Speicher der da freigeben muss. Jedoch versteh ich nicht ganz, wieso. Aber naja, soll mir mal wurscht sein, hauptsach es geht.

rema

Betreff: Re: MemFree und C/WStrings

BeitragDi, Apr 18, 2006 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Local cStr:Short Ptr

cStr=irgendeine_c_funktion();
...
MemFree cStr



Also, du erstellst einen INT Pointer, wen du eine Function aufnehmen willst. Und wen du MemFree anwendest, so wirk sich dies nicht auf die Function aus,

Bzw hat dies absolut keinerlei Auswirkung:

Zitat:
Function MemFree( mem:Byte Ptr )
Description Free allocated memory.
Information The memory specified by mem must have been previously allocated by MemAlloc or MemExtend


Wen dann GCCollect()

Zitat:
Function GCCollect()
Returns The amount of memory, in bytes, collected.
Description Run garbage collector.


Also, so müsste dies gehn:

Code: [AUSKLAPPEN]

Local cStr:Int Ptr

cStr=irgendeine_c_funktion();
...

cStr = NULL

GCCollect()



Schau mal ins Forum "Tutorials" da findest du ein paar interessante Sachen über dein Thema...

Blacal

BeitragDi, Apr 18, 2006 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
CStrings und WStrings werden vom GarbageCollector ignoriert, soviel ich weiß, da das keine Objekte sind.
Steht ja auch in der Docu

Zitat:

ToCString:Byte Ptr() Converts a string to a null terminated sequence of 8 bit bytes. The returned memory must be freed with a call to MemFree.

ToWString:Short Ptr() Converts a string to a null terminated sequence of 16 bit shorts. The returned memory must be free with a call to MemFree.


Und wenn ich den CString von einer C-Funktion her krieg, wie in meinem Beispiel oben, hat der GarbageCollector damit ja eh nix am hut.

Ich hab da halt ein bisschen rumprobiert, und MemFree scheint automatisch irgendwie zu erkennen, ob da eine ganze Zeichenkette dranhängt, oder nicht (womöglich protokoliert da irgendwas mit, wieviel Speicher man sich zu einer Adresse geben lässt)

Hab das Problem halt gehabt, weil ich eine kleine Zugriffsapi für datenbanken mache, und das mit SQLite ausprobiere. Da hatte ich am Anfang ein paar kleine Speicherprobleme. Klappt mitlerweile aber ganz gut.

Ahja, die Tutorials hab ich mir vor dem Post scho mal durchgschaut Wink Gfunden hab ich für mein Problem hier nix

Mfg Blacal

BtbN

BeitragFr, Jun 16, 2006 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab in BRL.Blitz folgendes entdeckt:
Code: [AUSKLAPPEN]
void *bbMemAlloc( int size ){
    void *b,*p;
    b=malloc(size+4+SIZEALIGN);
    p=(void*)( ((int)b+ALIGNMASK) & ~ALIGNMASK );
    if( p==b ) p=(void*)( (int)b+SIZEALIGN );
    ((void**)p)[-1]=b;
    return p;
}


Daraus schließe ich, das BMax an den Anfang des allocierten Speichers ein Int schreibt, wie groß der Speicher-Block ist.

Wäre dieses Rätsel also auch gelöst.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group