Windows weist dem virtuellen Addressraum des Prozesses reellen Speicher zu, wenn eswas angefordert wird (
VirtualAlloc und Co.)
und beim Beendes des Prozesses werden diese Zuweisungen einfach wieder freigegeben, es sei denn man hat den Speicher ge-shared und andere Prozesse haben auch noch eine Zuweisung ... Windows weiß also was welchem Prozess zugewiesen wurde.
SetLength führt Finalize/FinalizeArray und Initialize/InitializeArray für alle reservierten und freizugebenden Arrayfelder aus.
dynamische Arrays besitzen eine automatischen Speicherverwaltung/Initialisierung (ebenso wie Strings und Interfaces).
Wenn man also bei einem mehrdimensionalen Array das äußere Array freigibt, dann werden über Finalize die untergeordneten Arrays mit freigegeben.
Wärend der Programmlaufzeit muß man sich also "nur" um die nicht automatisch behandelten Speicheranfragen kümmer, wie Pointer und Objekte.
Wird ein Prozess beendet, dann räumt Windows auf ... gerade deswegen wurde ja mit der
WinNT-Serie die virtuelle Speicherverwaltung eingeführt.
- Windows weiß wem was gehört und kann damit auch ordentlich aufräumen
- Prozesse haben getrennte Speicherräume und können sich nicht einfach gegenseitig beeinflussen (früher konnte ein BufferOverrun auch schonmal einen fremden Prozess schrotten und nicht nur den Eigenen).