MemFree und C/WStrings
Übersicht

![]() |
BlacalBetreff: MemFree und C/WStrings |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
remaBetreff: Re: MemFree und C/WStrings |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Mfg Blacal |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group