Ja.laz847 hat geschrieben:Also kann man sagen SetLength(a,0) setzt a := nil, gibt aber den Speicher nur frei, wenn keine weitere Referenz auf den Inhalt besteht oder?
Ja.Aber wie ist das wenn noch irgendwo eine Referenz hängt? Vermutlich ist "if declocked(realp^.refcount)" die Referenzzählung oder?
Ja. "SetLength(b,n)" sorgt ausserdem dafür, dass a und b getrennte Speicherbereiche haben, "SetLength(b,length(n))" z.B. holt ein copy() nach.Nehmen wir an ich habe Copy vergessen und durch a:= b die Referenz kopiert anstatt die Daten? Setz ich dann SetLength(b,0) hat a die Referenz auf die Daten, b wird nur genilt.
Dann wird fpc_dynarray_clear_internal >> freemem(p); nicht ausgeführt sondern nur p:=nil was exakt dieses Verhalten auslösen könnte oder?
http://www.freepascal.org/docs-html/ref ... 480003.3.1
Nein. Bei der Zuweisung "b:= a" wird "incref(a); decref(b); pointer(b):= pointer(a)" ausgeführt. "decref(b)" gibt den Speicher frei falls der Referenzzähler 0 erreicht.Mach ich das inner Schleife und b ändert sich, bleibt doch da immer der "bisherige Inhalt" erhalten und wird nie freigegeben oder?
Code: Alles auswählen
while not(Terminated) do begin tmp := nil; while(w2) do begin [.......] // tmp[] wird resized und neu befüllt end; if(Length(globA[_pos]) <> Length(tmp)) then globA[_pos] := nil; // hier sollte dann beides gehen, SetLength(globA[_pos],0) oder nil, da nur eine referenz auf globA[_pos] besteht, tmp war nil und enthält neue daten // nimmt man aber diese zeile raus und nutzt weder setlength(a,0) noch nil bleibt doch da was im speicher liegen oder?
Im Prinzip schon, Free Pascal legt aber manchmal Zwischenvariablen an und gibt ausdrücklich keine Garantien über solch "internes Verhalten".Code: Alles auswählen
globA[_pos] := tmp; // ist es sicher das bei der neuen zuweisung ohne vorher setlength(globA[_pos],0) oder nil zu setzen der speicher des bisherigen inhalts SOFORT freigegeben wird, auch wenn wir den scope nicht verlassen sondern das in eine while tun? end;
Ich habe nicht das ganze Thema gelesen, warum bist du denn auf sofortiges Freigeben des Speichers angewiesen?
Man kann mit -al kompilieren, dann erzeugt FPC assembler Dateien:Ich kann kein Assembler aber ich sehe die call's auf die fpc Routinen. Wie mache ich diese Ausgaben sichtbar und wie / wo finde ich die entsprechenden Routinen?
http://www.freepascal.org/docs-html/use ... 450005.1.4
Oder man benutzt das assembler-Fenster: Das ist zwar MSEide, Lazarus hat aber ebenfalls ein assembler-Fenster. Die Routinen für dynamische Arrays sind in rtl/inc/dynarr.inc.