Release Self?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Ratchet

Betreff: Release Self?

BeitragFr, Okt 16, 2009 8:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallöchen,

Ich habe mehrere Typen bei denen ich eine eigene New Methode implementiert habe. Dort wird die neu erzeugte Instanz automatisch zu einer Liste hinzugefügt.
Nun würde ich gerne eine Destroy Methode erstellen bei der die Instanz aus der Liste entfernt und komplett gelöscht wird. Also dachte ich mir ich mache
BlitzMax: [AUSKLAPPEN]
Method Destroy()
List.Remove(Self)
Release Self
End Method


Allerdings meckert BM beim Release rum: "Expression must be a variable"
Gibt es da eine Möglichkeit? Oder wie macht ihr sowas?
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Firstdeathmaker

BeitragFr, Okt 16, 2009 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Release ist nur zum löschen eines Integer-Handles gedacht, nicht zu löschen einer Instanz als solches. Beispiel:

Code: [AUSKLAPPEN]
SuperStrict


Local a:TMyTestbed = New TMyTestbed
Local b:Int = HandleFromObject(a)


Local c:TMyTestbed = TMyTestbed(HandleToObject(b))
Print "Object a: "+(a<>Null)
Print "Object c: "+(c<>Null)
Print "b:"+b

Release b
c:TMyTestbed = TMyTestbed(HandleToObject(b))
Print "Object a: "+(a<>Null)
Print "Object c: "+(c<>Null)
Print "b:"+b



a = Null
c:TMyTestbed = TMyTestbed(HandleToObject(b))
Print "Object a: "+(a<>Null)
Print "Object c: "+(c<>Null)
Print "b:"+b

GCCollect()
End


Type TMyTestbed
   Field name:String = "hallo"
   
   Method Delete()
      Print "Testbed deleted"
   End Method
End Type




Wenn du ein Objekt wirklich löschen möchtest, muss du alle Verbindungen (Links) auf dieses löschen, sprich alle Variablen in denen es gespeichert wird auf "Null" setzen (auch in Listen, Arrays und TMaps). Erst dann holt sich der GC die Reste. Ob du wirklich alle Verbindungen gelöscht hast, kannst du mit der "Delete()" Methode überprüfen: Sie wird erst aufgerufen, wenn du alle Verbindungen gelöscht hast und der Garbage Collector aktiviert wurde. Daher ist sie auch nicht dazu geeignet die Verbindungen zu löschen; das muss man in einer eigenen Methode machen.


Das Einzige was du bei deinem Code machen musst ist die Zeile mit Release wegzunehmen. Solange du den Link aus der Liste entfernst existieren dann ja keine weiteren Verweise mehr auf das Objekt und es wird automatisch gelöscht. Es ist allerdings eleganter und effizienter, wenn du beim hinzufügen zu der Liste den zurückgegebenen Link im Objekt speicherst und dann über removelink() löscht.


Beispiel:

Code: [AUSKLAPPEN]

'vorher
GCCollect()
Print GCMemAlloced()


Main() 'Zeugs machen

'nachher
Rem
Normalerweise würde ich das nicht schreiben: Der GC läuft automatisch.
Allerdings möchte ich, dass er genau jetzt nachschaut ob es was zu bereinigen gibt,
da ich nachher ja GCMemAlloced() aufrufe.
End Rem
GCCollect()
Print GCMemAlloced()




Function Main()
   'Sachen erstellen
   TName.Create("FDM")
   TName.Create("Decrayer")
   
   'Sachen wieder löschen
   Local n:TName
   n = TName.get("FDM")
   n.remove()
   
   n = TName.get("Decrayer")
   n.remove()
   n = Null 'Wichtig an dieser Stelle, da sonst n immer noch auf den TName mit name="Decrayer" zeigen würde und es somit nicht gelöscht würde.
End Function


Type TName
   'Global
   Global list:TList = New TList
   
   Function Create:TName(name:String)
      Local n:TName = New TName
      n.setName(name)
      Return n
   End Function
   
   Function Get:TName(name:String)
      For Local n:TName = EachIn list
         If n.getName() = name Return n
      Next
   End Function
   
   'Local

   Field _name:String
   Field _link:TLink
   
   Method New()
      _link = TName.list.addlast(Self)   
   End Method
   
   Method setName(name:String)
      Self._name = name
   End Method
   
   Method getName:String()
      Return Self._name
   End Method

   Method remove()
      RemoveLink(_link)
   End Method
End Type
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Ratchet

BeitragFr, Okt 16, 2009 9:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass ich zum Löschen alle Rezerenzen auf Null setzen muss war mir zwar schon klar. War mir aber nicht sicher ob ein Löschen aus der Liste reicht. Aber wo du es sagtst wird mir klar, dass es ja auch nur eine Referenz ist.
Dann werde ich auf jeden Fall auch noch RemoveLink verwenden.
Dankeschön Smile
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group