02. januar 2006 - 15:14Der er
5 kommentarer og 1 løsning
Garbage collection i Delphi .NET
Da jeg er vant til at oprette og nedlægge mine objekter i VCL, halter min kodemetodik nu, efter at jeg er begyndt at programmere i .NET:
Humlen i problemet er: Hvordan kan jeg se om et givet objekt er noget som GC. håndterer?
I bøger og på nettet kan jeg læse, at det er noget med, at hvis den kalder systemspecifikke resourcer, eksempelvis filer, så skal jeg lave en finalize-destructor for det objekt som GC'eren fanger.
... men jeg kan ikke se hvordan de eksisterende objekter er oprettet og derfor bliver i tvivl om hvad der sker i baggrunden; kalder de noget som skal frigives???
Har opgivet at læse mig frem til regler om hvordan man gør og søger i stedet efter en metode til at måle, om det jeg laver, bliver frigivet igen.
Eksempel: - Måle ram-forbrug før og efter. - Overloade GC'eren så man kan logge dens arbejde til en fil. - ...
Bare et eller andet, for min PC melder "Out of virtual memory" flere gange i løbet af dagen; tror ikke det kun er Borlands skyld!
Eventuelt links til (gode) sider hvor der er delphi-specifik snak om den %&!"¤#&!"% GC'er.
Nu har jeg aldrig brugt Delphi .NET, men jeg har brugt 4 andre .NET sprog.
Alt det der er rent .NET skal du ikke bekymre dig over. Når der ikke længere er brug for det så bliver det GC'et.
Det som indeholder referencer til noget som ligger ud over .NET (åbne filer, database connections etc.) skal man huske og få releaset.
Alt det indbyggede i .NET har en .Close eller en .Dispose metode som du kan kalde og gør du det så er alt OK.
Hvis du koder fornuftigt og kalder dem og catcher exceptions etc. (og også får kaldt dem når du catcher en exception) så har du ikke brug for at lave den slags finesser i din egen kode.
Du har ret i, at det mest er et spørgsmål om tilvænning. Kan godt lide konsekvensen i, at rydde op efter sig, i stedet for at have den "virtuelle mor" gøre det for sig. Det er svært at overlade ansvaret til en GC. man ikke kender.
Jeg forstår også det du skriver, men er stadig i tvivl. Bliver derfor nødt til at spørge bede dig udpensle (schnitten es aus in pap - eller som Babelfish foreslår det: schneiden Sie es heraus im Karte Brettpapier) det lidt.
- Jeg har en klasse hvori der i constructoren åbnes en xml-fil vha. en stream; den sædvanlige løsning med at oprette en stream, try-finally og "close" igen. Der er jo tale om filarbejde, men skal jeg gøre noget der udover at lukke filen igen?
- Xml-filen læses og der oprettes 10000 (n) data-objekter der smækkes i en nedarving af hashtable. Når hash-træet ikke er nødvendigt længere, så klarer GC'en også oprydningen, ikke? Jeg kan bare sætte variablen til nil så der ikke er referencer til objektets hukommelse.
- Hvis en klasse oprettes i et procedure-scope (den ender vel på heap) og ikke bruges/refereres udenfor proceduren, så fjernes den automatisk?
- Det er svært at se hvornår dispose'en skal overrides for at lave oprydning - og nu jeg tænker over det, så tror jeg ikke jeg har set et eksempel.
Det kunne være rart (beroligende) om man kunne teste/verificere, at tingene bliver ryddet ordentligt op. Det at min PC's hukommelse løber fuld fortæller mig, at der er noget jeg overser.
Nu er den !#¤!"/#¤/!"¤/(!" TypeLoadException også en microsoft .NET exception der dukker op når der er assembly-uoverensstemmelse mellem udviklingsmiljøet og stedet hvor man prøver at køre programmet. Dette til trods for at jeg synes jeg oversætter med de samme biblioteker.
Tak for dit forsøg på at hente mig ud af tågen og omvende min sjæl til moderne programmeringsteknik hvor alt er nemt og automatisk...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.