Deutsch
Bugs und vermeintliche

Erledigt: Bugs bei DISPOSE + Objektvariablen?

 

Sebastian
Sprenger
Wenn ich ein Objekt mit Dispose  freigebe und noch ein Objekt in dieselbe Variable erzeuge, bekomme ich unter XProfan10Free und 11 den Fehler Zuweisung auf dieses Objekt nicht möglich . Wenn ich zusätzlich zu oder statt dem Dispose  einen Bereich mit 0 Bytes dimensioniere, tuts! Wieso aber nicht bei Dispose ?
KompilierenMarkierenSeparierenDesweiteren hab ich den Eindruck, dass Objekte in Arrays gar nicht dispose d werden... Zum Vergleich: Bei diesem Code ohne Arrays kommt ja das scheinbar richtige raus:
KompilierenMarkierenSeparieren
class KLASSE=feld%
var objekt#=new(KLASSE)
objekt#.feld%=12345
dispose objekt#
print classof(objekt#)  ""
print sizeof(objekt#)  0
print objekt#.feld%  stürzt ab, naja, existiert immerhin nicht mehr
waitinput
Aber hier...!? (Man beachte, dass auch hier das Neuzuweisungsproblem (s.o.) besteht, der Befehl Dim  aber wohl keine Arrays erwartet...)
KompilierenMarkierenSeparieren
class KLASSE=feld%
declare objekte#[0]
objekte#[0]=new(KLASSE)
objekte#[0].feld%=12345
dispose objekte#[0]
print classof(objekte#[0])  immer noch "KLASSE"
print sizeof(objekte#[0])  immer noch 2
print objekte#[0].feld%  immer noch 12345
waitinput
Gruß, Sebastian
 
Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32
Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM
Windows Me, 1.8 Ghz, 256 MB RAM
11.10.2008  
 




RGH
Hallo,

einzelne Arrayelemente können nicht disposed werden, sondern nur das komplette Array:

Dispose Objekte#[]
Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.10.2008  
 




Sebastian
Sprenger
Einzelne nicht? OK... Aber auch wenn ich alle auf einmal dispose, passiert nichts:
KompilierenMarkierenSeparieren
class KLASSE=feld%
declare objekte#[9]

whileloop 0,9

    objekte#[&loop]=new(KLASSE)
    objekte#[&loop].feld%=122*&loop

endwhile

dispose objekte#[]

whileloop 0,9

    objekte#[&loop].feld%=objekte#[&loop].feld%+&loop
    print classof(objekte#[&loop]),
    print sizeof(objekte#[&loop]),
    print objekte#[&loop].feld%

endwhile

waitinput
Wird der Speicher denn da jemals wieder freigegeben?
 
Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32
Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM
Windows Me, 1.8 Ghz, 256 MB RAM
11.10.2008  
 




Nico
Madysa
Jetzt hast du wieder vergessen, das Array mit Dim zu dimensionieren.
Prinzipiell sollte es so klappen:
KompilierenMarkierenSeparieren
class KLASSE=feld%
declare objekte#[9]
Dim objekte#[] , KLASSE

whileloop 0,9

    objekte#[&loop]=new(KLASSE)
    objekte#[&loop].feld%=122*&loop

endwhile

dispose objekte#[]

whileloop 0,9

    objekte#[&loop].feld%=objekte#[&loop].feld%+&loop
    print classof(objekte#[&loop]),
    print sizeof(objekte#[&loop]),
    print objekte#[&loop].feld%

endwhile

waitinput

Am besten ist es, wenn du im selben Atemzuge, in dem du Dim schreibst, auch das zugehörige Dispose ans Ende klatschst,

PS: In älteren Windows-Versionen konnte es tatsächlich passieren, dass der Speicherplatz nichtfreigegebener Bereiche auch blockiert bleibt. Aber ab WIndows XP sollte spätestens bei End der letzte Bereich automatisch freigegeben werden.
 
Nico Madysa
13.10.2008  
 




RGH
@Nico:
Sebastian macht es schon richtig: Beii einem Objekt- oder Struktur-Array kann man jedem einzelnen Element eine Klasse bzw. eine Struktur zuweisen, sogar jedem Element eine andere.

@Stefan:
Du hast recht. Offensichtlich wirkt auch hier DPSPOSE nicht zuverlässig. Ich werde es mir mal näher ansehen ...

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
13.10.2008  
 




Nico
Madysa
Asche auf mien Haupt, ich hab das "New" glatt übersehen...
 
Nico Madysa
13.10.2008  
 




RGH
Ok, ich habe in der Mittagspause noch mal genauer nachgesehen:

1. Das zuerst genannte Problem (ohne Bereisarray) betrifft nur die NEW-Funktion: Sie funktioniert tatsächlich nach einem Dispose bei Objekten nicht. Das Dispose wurde aber korrekt durchgeführt und der Speicher freigegeben. Workaround: Möglichkeit 1: Statt Dispose in diesem Fall "dim objekt#,0" benutzen. Ein Dispose ist dann nicht notwendig. Möglichkeit 2: Die Klasse mit Dim zuweisen "Dim objekt#, KLASSE".

2. Das Disposen von Bereichsarrays funktioniert tatsächlich nicht. Workaround: Ein Bereichsarray nicht mehrfach verwenden. Beim Programmende wird der Speicher freigegeben.

Beide Bugs werden in der nächsten Version behoben.

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
13.10.2008  
 




RGH
... und ich setze noch einen drauf:

Ab der nächsten Version (möglicherweise 11.1) wird es auch möglich sein, ein einzelnes Element eines Bereichs-, Struktur- oder Objekt-Arrays zu disposen:

Dispose Objekte[5]
Diesem Element kann dann mit New wieder eine Klasse oder Struktur zugewiesen werden.

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
14.10.2008  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.371 Betrachtungen

Unbenanntvor 0 min.
Sebastian Sprenger06.06.2013
Jörg Sellmeyer04.11.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie