Is het waar dat je geen Free meer hoeft aan te roepen voor .NET objecten als je ze wel zelf Create hebt gedaan en de objecten geen owner hebben?
Is het waar dat je geen Free meer hoeft aan te roepen voor .NET objecten als je ze wel zelf Create hebt gedaan en de objecten geen owner hebben?
Unmanaged code moet je zelf nog vrijgeven, de gc zorgt ervoor dat de managed code vrijgegeven wordt en de boel proper blijft.
Should you call Free in the .Net Delphi world?
Zie ook Help --> Memory management on .Net
DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden
Gebruik geen Free of destructor meer in .NET. Het is namelijk zeer performance verlagend. Om toch nog eventuele unmanaged code vrij te geven, kan je beter de Dispose Design Pattern implementeren.
Of Delphi.NET de free m.b.v. de Dispose design pattern is geimplementeerd, weet ik niet maar je kan het zo controleren
No Silver Bullet: Essence and Accidents of Software Engineering by Frederick P. Brooks, Jr. (April 1987)
Free is op System.Object geïmplementeerd met een Class Helper (TObjectHelper).Originally posted by Link
Of Delphi.NET de free m.b.v. de Dispose design pattern is geimplementeerd, weet ik niet maar je kan het zo controleren
Free is gewoon Dispose (met nog wat notifydingen) en doet dus alleen maar iets als je object een instantie is van een klasse die de IDisposable interface implementeert. Het resultaat is dan:Code:(Self as IDisposable).Dispose
All methodologies are based on fear. -- Kent Beck.
Ok dan is het netjes geregeld binnen Delphi.NET
No Silver Bullet: Essence and Accidents of Software Engineering by Frederick P. Brooks, Jr. (April 1987)
Ja, het is eigenlijk beter dan in C# en Visual Basic.NET: je hoeft je nooit af te vragen of je te maken hebt met een IDisposable (wat meestal een teken is dat je best Dispose aanroept).
Gewoon altijd .Free en die regelt het dan.
All methodologies are based on fear. -- Kent Beck.
Ik vind het een tikje vreemd dat het vertragend is??! Je geeft immers de GC extra informatie!?
Weet iemand wat dit veroorzaakt?
(Bij Java is het bij software die een beetje moet performen redelijk normaal references op NIL te stellen, om vrijgeven te forceren, vandaar de vraag)
Tja vertragend of niet.. ik geef mijn zelf aangemaakte dingetjes ook zelf weer vrij, vertragend of niet. In de tijd dat ik nog met VB.NET bezig was en Excel/Word/Outlook aansprak heb ik meerdere malen gezien dat de GarbageCollector het dus niet netjes opruimde. Waar dit wel was verwacht. Ik weet niet of het aan de code lag, maar sindsdien heb ik besloten alles gewoon zelf vrij te geven wat ik zelf aanmaak (vertragend of niet).
Ik idem, maar heb dat dus op Java geleerd. GC's hebben er ietwat andere opvattingen over wanneer ze geheugen vrij moeten gaan geven dan ik.
Daarnaast heb ik ook nog de stille hoop dat er ooit analyse software komt (a la memproof) waar je je working set mee zou kunnen inspecteren.
Geen oude troep hebben rondliggen (of althans dan duidelijk anders gemarkeerd) zou dan kunnen helpen.
Ik kwam laatst wel wat leuks tegen voor Delphi win32 om je gebruikte geheugen in je applicatie visueel weer te geven. Helaas moet je daar wel de RTL voor opnieuw compilen. Zie http://blogs.slcdug.org/rhordijk/arc...12/29/756.aspx
We adore chaos because we like to restore order - M.C. Escher
De reden dat je GC trager wordt door destructors in je class komt door de manier van garbage collecting in .NET. Zie voor meer info deze artikel van msdn http://msdn.microsoft.com/library/de...etgcbasics.asp
en nog een url: http://msdn.microsoft.com/library/de...estructors.asp
No Silver Bullet: Essence and Accidents of Software Engineering by Frederick P. Brooks, Jr. (April 1987)
Samengevat: gebruik Free (of Dispose voor alle implementors van IDisposable in andere talen dan Delphi) voor alle instanties van klassen die je niet zelf heb geschreven en implementeer IDisposable in je eigen klassen.
All methodologies are based on fear. -- Kent Beck.
Ik moet zeggen dat ik in .NET veel dingen niet meer vrijgeef. Ik ben ook meteen gebruik gaan maken van het feit dat er een GC is. Zo kun je nu dus functies maken die objecten retourneren. Verder heb je, met name in .NET, het 'probleem' dat je zaken niet direct vrij kunt geven. Vaak zet je die in je session om ze te hergebruiken. Dan ben je dus zeker van je GC afhankelijk.
Maar in 'klassieke' structuren geef ik nog steeds wel dingen vrij. Daar heb ik nog steeds de gewone try/finally structuren.
Verder is het wel van belang dat je je rommel opruimt, zelfs al geef je het niet vrij. Als je tot nu toe een datamodule gebruikte en deze weer vrijgaf werd dus ook je connectie vrij gegeven. Geef je nu je 'datamodule' niet meer vrij dan moet je misschien wel je connectie alvast sluiten als je deze niet meer nodig hebt. Anders loop je zomaar tegen je maxiaal aantal connecties aan (en stort de Links sectie van NLDelphi in).
Last edited by Marcel; 06-Jan-05 at 22:57.
Marcel
Dat soort dingen doe je nu net in een Dispose method van een IDisposable. In Delphi gebruik je daarvoor gewoon Free, en dat roept dan de IDisposable.Dispose op. Free roept dus niet meer de destructor op (Finalize), die wordt pas uitgevoerd op het moment dat de GC het object opruimt. En om zeker te zijn dat je geen twee keer opruimt zet je dan in je Dispose method:Originally posted by Marcel
..Verder is het wel van belang dat je je rommel opruimt, zelfs al geef je het niet vrij...
Dit zorgt er voor dat de Finalize niet zal worden opgeroepen door de GC.Code:GC.SuppressFinalize(Self);
In de destructor staat typisch niet meer danDus Free=Dispose en Dispose geeft het geheugen (object) niet vrij, alleen resources, handles, connecties, ...Code:Dispose(False);
Noteer ook dat Close in vele gevallen niets anders is dan een call naar IDisposable.Dispose.
Zie ook bijvoorbeeld Implementing a Dispose Method in .NET Framework Developers Guide
ms-help://borland.bds3/cpguidenf/html/cpconimplementingdisposemethod.htm
All methodologies are based on fear. -- Kent Beck.
Zelfs als je denkt dat je het doet, doe je het dus nog niet, en als je object een IDisposable is, doe je het beter welOriginally posted by Marcel
Ik moet zeggen dat ik in .NET veel dingen niet meer vrijgeef...
All methodologies are based on fear. -- Kent Beck.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks