Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
992to996
992to996
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Klassen/Objekte zur Laufzeit entladen

Klassen/Objekte zur Laufzeit entladen
09.07.2008 15:47:00
Christian
Folgende Situation:
Ich instanziere eine selbstgeschriebene Klasse "MyObj".

Dim MeinObjekt as MyObj
set MeinObjekt = new MyObj

Dabei wird eine Objektvariable "MeinObjekt" erstellt die dann das Objekt "MyObj" enthält.
Bis dahin funktioniert alles ganz toll.
Aber.. Wie bekomme ich "MeinObjekt" nun wieder aus dem Speicher!?!? Ich finde kein delete befehl.. "Unload" funktioniert auch nicht...
Es muss doch einen Weg geben wie ich zur Laufzeit den Speicher, der "MeinObjekt" einnimmt, wieder freigeben kann!!

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 15:51:36
Peter
Hallo Christian,
was ist mit MeinObjekt = Nothing ?
Gruß Peter

AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 15:57:13
Christian
Mit Set MeinObjekt = Nothing gibt man nicht den Speicher wieder frei sondern weisst die ObjektVariable "MeinObjekt" an kein Objekt zu beinhalten.
Der Speicher der mit (...) = new MyObj eingenommen wurde ist nach wie vor belegt.
Es muss also einen anderen weg geben.. ich kann mir jedenfalls nicht vorstellen, dass die Herrn Programmierer von WinzigWeich so dämlich waren keinen Befehl zur Wiederfreigabe von Speicher eingebaut haben...

AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 16:25:23
Johannes
Hallo Christian,
kurze und knappe Antwort: VB(A) (der interne Garbage Collector [wenn man das ueberhaupt so nennen darf]) gibt Objekte bzw. Speicher frei, wenn sie nicht mehr referenziert sind. Angeblich egal ob sie auf Nothing gesetzt sind, oder nicht.
Hier gibts Literatur ueber die Philosophie, wie und ob VBA Objekte im Speicher freigegeben werden (sollen):
http://tinyurl.com/cq95p
Gruesse,
Johannes

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 16:48:00
Christian
Naja.. die scheinen sich wegen der Vorgehensweise auch nicht ganz einig zu sein...
Das was ich ursprünglich in eines meiner Programme implementieren wollte war eine verkettung von objekten...
Also wo in der Klasse z.B. folgendes steht:

.
.
public text as string
public NextObj as MyObj
.
.

und im Modul:

dim MeinObjekt as MyObj
dim AktuellesObj as MyObj
set MeinObjekt = new MyObj
set AktuellesObjekt = MeinObjekt
for i = 1 to 10
AktuellesObjekt.Text = "Ebene " & i
set AktuellesObjekt.NextObj = new MyObj
set AktuellesObjekt = AktuellesObjekt.NextObj
next

Dabei wird eine Kette von Objekten erstellt die jeweils eine Variable "Text" beinhalten. Also im Entferntesten ein Array. Vorteil liegt klar auf der Hand... Zur Laufzeit lassen sich so große datenmengen Dynamisch in den Speicher laden und bearbeiten. Zwar alles nur sequenziell aber für viele Anwendungen reicht das.
In diesem Beispiel werden 10 Ebenen erstellt. Also 10 Objekte erstellt die Speicher in beschlag nehmen.
Erhöht man die Zahl auf z.B. 30000 kann man im Taskmanager sehr schön sehen das der Speicherverbrauch von Excel deutlich zunimmt.
Nach beendigung des Makros gibt Excel eine Fehlermeldung raus das nicht genügen "Stapelspeicher" zur verfügung steht. Daher denke ich das Excel den Speicher NICHT wieder frei gibt und das besser manuell gemacht werden sollte.

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 16:58:00
Johannes
Nichts anderes hab ich behauptet, als dass es Uneinigkeit darueber gibt. Wenn man der Philosphie glauben schenken magt, wird dein Speicher erst dann freigegeben, wenn das Elternobjekt nicht mehr referenziert wird - was natuerlich bei deinem Strukturvorhaben fatal ist.
Dann bleibt dir nichts anderes uebrig als auf die WinAPI auszuweichen und wie in C-Gewohnheiten malloc und free zu verwenden, siehe:
http://www.vbaccelerator.com/home/VB/Code/Techniques/Malloc_in_VB/article.asp
Viel Vergnuegen dabei! :-)
Gruesse,
Johannes

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 17:03:00
Christian
Ja ok.. hmm.. ist echt schade das Winzigweich einem da mal wieder balken zwischen die beine wirft..
Ich werd mal schauen ob ich das per API hinbekomme...
Set ObjektVar = Nothing
"Hebt die Zuordnung von ObjektVar zu einem bestimmten Objekt auf. Durch Zuweisen von Nothing an ObjektVar werden alle Ressourcen des zuvor referenzierten Objekts freigegeben, sofern das Objekt von keiner anderen Variablen referenziert wird."
was ein mist... entschuldigt die ausdrucksweise.. aber warum können die nicht mal ansatzweise das vernünftig zuende denken was die anpacken...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige