Wie entferne ich ein Type-Objekt aus dem Speicher?
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
TravisBetreff: Wie entferne ich ein Type-Objekt aus dem Speicher? |
So, Sep 11, 2005 20:26 Antworten mit Zitat |
|
---|---|---|
Angenommen ich habe einen Type für irgendein Spielobjekt wie z.B. für die Gegner. Wie kann ich einen einzelnen Gegner löschen und den Speicher dafür wieder freimachen?
Erschlagt mich nicht, aber ich finde keine Lösung. Der Release-Befehl fordert immer eine Integer-Variable, wenn ich versuche das Objekt anzugeben. |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Dreamora |
So, Sep 11, 2005 20:52 Antworten mit Zitat |
|
---|---|---|
Garnicht.
Sobald es keinen Verweis auf den Type mehr gibt, wird er beim nächsten Flushmem aufruf (das ohnehin in der Mainloop stehen muss) automatisch entsorgt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
TheShadowModerator |
So, Sep 11, 2005 22:37 Antworten mit Zitat |
|
---|---|---|
Ich hab mit Dreamora schon eine heisse Diskussion im engl. Forum.
Aber irg. sind nur wenige meiner Meinung. Mann kann Type-Objekte nicht löschen. Das geht nur, wenn man alle Type-Variablen auf NULL setzt und FlushMem macht - dann erst... Vergisst man eine Type-Variable, dann wird es nicht gelöscht - und im schlimmsten Fall hat man weiterhin Zugriff über diese vergessene Variable darauf. Das erfordert mehr Konzentration bei der Programmierung als nötig. Und dieser Weg ist meiner Meinung nach wie von einem anderen Universum - einfach nur unhandlich und wahhh... das macht die Programmierung mit Blitzmax "unschön"... Einzige Lösung dafür wäre: ein Delete-Keyword, welches Type-Referenzen autom. auf Null setzt die auf einen Type-Eintrag linken - natürlich ohne selbst FlushMem auszulösen. Meiner Meinung ein hilfreicher Befehl. Selbst wenn der langsamer wäre, würde ich diesen benutzen - für schnellerern code macht man dann weiterhin "NULLs"... Naja Mark hat es irg. nicht so mit Types drauf - bei alten BB's waren die Types global (ein großer Fehler). In BBmax hat man diesen Design-Fehler eliminiert und dafür einen ganz neuen eingeführt - kein Delete-Befehl... (wieder so ein Design-Fehler) bzw. "selbst-NULL-ierung" von Type-Referenzen ist nicht eingebaut - so wie es in alten BB's war. Das war meiner Meinung nach ein sehr geiles Feature zu schade - irgendwann wird es sich wie ein Boomerang rächen, dass man sowas nicht früh genug implementierte... genau wie bei globalen Types in alten BB's. |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
regaa |
Mo, Sep 12, 2005 0:28 Antworten mit Zitat |
|
---|---|---|
Na dann warte mal hier auf Dreamoras Post . | ||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
bruZard |
Mo, Sep 12, 2005 7:26 Antworten mit Zitat |
|
---|---|---|
@TheShadow: Das ist geballter Unsinn. So wie es Dreamora beschrieben hat ist es korrekt. Auch ein myVar:MyType = Null erzwingt beim nächsten Flushmem ein Löschen. Einmal Flushmem in der Hauptschleife (nach Flip) genügt i.d.R. für den gesamten Code um keine Leaks zu produzieren. | ||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Jolinah |
Mo, Sep 12, 2005 11:14 Antworten mit Zitat |
|
---|---|---|
Und wie schon einmal erwähnt haben Variablen einen Gültigkeitsbereich. Ist eine Variable nicht mehr gültig verschwindet sie sowieso und das nächste Flushmem löscht das Objekt auch wenn man nichts auf Null gesetzt hat.
Ausser natürlich man benutzt Globale Variablen, aber dann sind die ja auch aus irgend nem Grund Global, wäre mist wenn da die Objekte verschwinden würden |
||
Travis |
Di, Sep 13, 2005 18:29 Antworten mit Zitat |
|
---|---|---|
Danke für eure Hilfe. Ich habe es jetzt so gelöst, dass ich zuerst den Type aus der Liste entfernt habe und dann in der Hauptschleife FlushMem() angewendet habe. | ||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Markus2 |
Di, Sep 13, 2005 18:47 Antworten mit Zitat |
|
---|---|---|
Ich mach das so ...
löschen geht dann mit TTriangle.Free X wichtig ist das Var in der Freigabe Funk. Code: [AUSKLAPPEN] Type TTriangle 'only for Triangle List and Ray Intersection Field V1:TV3D Field V2:TV3D Field V3:TV3D Function Create:TTriangle(V1:TV3D,V2:TV3D,V3:TV3D) Local T:TTriangle=New TTriangle T.V1=V1 T.V2=V2 T.V3=V3 Return T End Function Function Free(T:TTriangle Var) T.V1=Null T.V2=Null T.V3=Null T=Null End Function End Type |
||
Jolinah |
Mi, Sep 14, 2005 0:58 Antworten mit Zitat |
|
---|---|---|
Ist eigentlich ne gute Lösung aber auch da besteht leider noch das Problem dass man für jede Variable Free aufrufen muss wenn man z.B. zwei Variablen hat die auf das selbe Objekt zeigen.
PS: T.V1 = Null usw. wäre nicht nötig. Indem man T = Null setzt werden auch die Eigenschaften auf Null gesetzt, bzw. der Referenzzähler wird um 1 verkleinert. |
||
rema |
Mi, Sep 14, 2005 6:42 Antworten mit Zitat |
|
---|---|---|
Eigentlich ist dies überfüssig alle Variabeln auf NULL zu setzen. Nur einfach den Type auf NULL setzten und auch nicht vergessen den Type aus der TList zu löschen, fals eine vorhanden ist.
' erstellen mylist = new LList mytype:TType = new TType mylist.addlast mytype ' löschen mylist.remove(mytype) mytype = Null Du kannst dies ja in einem Test mal mit MemAlloced() testen. |
||
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group