Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Geen Free meer nodig in .NET?

  1. #1
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649

    Geen Free meer nodig in .NET?

    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?

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

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

  4. #4
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    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 op System.Object geïmplementeerd met een Class Helper (TObjectHelper).
    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.

  5. #5
    Ok dan is het netjes geregeld binnen Delphi.NET

  6. #6
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    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.

  7. #7
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    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)

  8. #8
    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).

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    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.

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

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

  12. #12
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    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.

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

  14. #14
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Originally posted by Marcel
    ..Verder is het wel van belang dat je je rommel opruimt, zelfs al geef je het niet vrij...
    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:
    Code:
    GC.SuppressFinalize(Self);
    Dit zorgt er voor dat de Finalize niet zal worden opgeroepen door de GC.
    In de destructor staat typisch niet meer dan
    Code:
    Dispose(False);
    Dus Free=Dispose en Dispose geeft het geheugen (object) niet vrij, alleen resources, handles, connecties, ...
    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.

  15. #15
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Originally posted by Marcel
    Ik moet zeggen dat ik in .NET veel dingen niet meer vrijgeef...
    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 wel
    All methodologies are based on fear. -- Kent Beck.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Geen 1024x768 meer?
    By Frank in forum Koffiehoek
    Replies: 6
    Last Post: 08-Feb-03, 18:44
  2. kan geen Avatar meer uploaden
    By Greta in forum De website
    Replies: 6
    Last Post: 05-Jan-03, 16:10
  3. geen openGL support meer
    By DeBug in forum Algemeen
    Replies: 3
    Last Post: 08-Sep-02, 20:07

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •