Microsoft Excel

Herbers Excel/VBA-Archiv

Klassen/Objekte zur Laufzeit entladen

Betrifft: Klassen/Objekte zur Laufzeit entladen von: Christian
Geschrieben am: 09.07.2008 15:47:37

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!!

  

Betrifft: AW: Klassen/Objekte zur Laufzeit entladen von: Peter Feustel
Geschrieben am: 09.07.2008 15:51:36

Hallo Christian,

was ist mit MeinObjekt = Nothing ?

Gruß Peter


  

Betrifft: AW: Klassen/Objekte zur Laufzeit entladen von: Christian
Geschrieben am: 09.07.2008 15:57:13

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...


  

Betrifft: AW: Klassen/Objekte zur Laufzeit entladen von: Johannes D.
Geschrieben am: 09.07.2008 16:25:23

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


  

Betrifft: AW: Klassen/Objekte zur Laufzeit entladen von: Christian
Geschrieben am: 09.07.2008 16:48:18

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.


  

Betrifft: AW: Klassen/Objekte zur Laufzeit entladen von: Johannes D.
Geschrieben am: 09.07.2008 16:58:11

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


  

Betrifft: AW: Klassen/Objekte zur Laufzeit entladen von: Christian
Geschrieben am: 09.07.2008 17:03:36

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...


 

Beiträge aus den Excel-Beispielen zum Thema "Klassen/Objekte zur Laufzeit entladen"