Ergebnis 1 bis 4 von 4

Thema: Frage zur Speicherfreigabe bei rekursiven Methoden

  1. #1

    Frage zur Speicherfreigabe bei rekursiven Methoden

    Ich hab ein Modul, in dem sich eine Methode rekursiv aufruft. Dabei werden ständig neue Objekte erschaffen, weil die Iterationen nur mit Kopien eines Arrays arbeiten sollen. Wird der Speicher dann direkt nachdem die Rekursion beendet ist wieder freigegeben?

  2. #2
    Der Speicher wird generell erst dann freigegeben, wenn neuer Speicher angefordert wird und der vorhandene nicht mehr ausreicht, oder wenn eine bestimmte Anzahl von Objekten erzeugt wurde. Ich glaub Ruby startet den GarbageCollector das erste Mal, wenn du mehr als 8 Megabyte Speicher verbrauchst. Aber das kann im Maker auch anders sein. Jedenfalls musst du dir keine Sorgen machen, dass der Speicher nicht mehr ausreicht, denn vorher wird Ruby den GarbageCollector aufrufen und alle nicht mehr referenzierten Objekte löschen. Nicht mehr referenziert heißt: es darf keine Variable mehr auf das Objekt zeigen. In einer Methode mit lokalen Variablen ist das dann der Fall, wenn die Methode beendet wurde. Ruft die Methode sich rekursiv selbst auf, so sind innerhalb des rekursiven Aufrufs noch alle lokalen Variablen der aufrufenden Methode gültig (wobei ich nicht weiß wie weit Ruby hier optimiert - ich fürchte aber, es wird nicht viel sein).

    Achja: Eine Kopie eines Arrays bedeutet nicht zwangsweise, dass auch alle Elemente kopiert werden. Dies geschieht in Ruby lazy. Das heißt: Erst wenn du schreibend auf einen der beiden Arrays zugreifst, werden die Elemente kopiert. Vorher teilen sich beide Arrays ihren Speicherbereich.

  3. #3
    Aber trotzdem würden Zugriffe auf beide Arrays nicht dazu führen, dass man inkonsistente Werte hat, oder?

    Ich hab deswegen Kopien benutzt, weil ich es so gelernt hab, dass bei Objekten sonst nur eine Referenz übergeben wird. Oder ist das bei Funktionsaufrufen nicht so? Ich kenne dieses Beispiel:

    a[1] = 1
    b = a
    b[1] = 2

    Dann wäre soweit ich weiß in a[1] auch die 2, weil b nur eine Referenz auf a ist.

  4. #4
    Ist schon richtig so. Sobald du auf der Kopie einen Schreibzugriff durchführst, wird intern eine echte Kopie draus gemacht.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •