[fpc-pascal]ReAlloc Question
James Mills
prologic at prologitech.com
Fri May 16 15:35:58 CEST 2003
On Fri, May 16, 2003 at 01:25:22PM +0000, memsom at interalpha.co.uk wrote:
> James,
>
> didn't I send you a revised version of this ages ago... even if you dumped the
> whole of it I would have pointed out why not to use Init and Done over Create
> and Destroy. I'll tell you one good reason why you may have memory
> leaks... 'done' will never get called if you 'free' an instance of TStrings.
> That alone will cause a memory leak.
>
> You did see TList too, right? TStringList and TList will do everything you
> want, and TObjectList is another good one (if fpc has it implemented.) For 1.1
> also look out for TInterfaceList (one of my favourites in Delphi) and there's
> also the heavy handed but usefull TThreadList in multithreaded environments ;-)
>
> In fact, looking at your code, your biggest problem is that you missed how the
> destructor works in Object Pascal. TObject has a virtual destructor
> called 'Destroy' that gets called when you call 'Free'. Calling the destructor
> directly is simply wrong. If you are using Turbo Pascal mode, you should be
> calling 'dispose( instance, destructor );' and in Object Pascal (Delphi like)
> mode it has to be 'instance.free' which will indirectly call the destructor. If
> you name your destructor something random and call it directly, it will leak
> memory like a sieve.
Okay, I didn't know this. Thanks. Sorry if you've tried helping me
before, too much uni work I guess and it was a long time ago...
>
> Also it would be worthwhile take a look how inheritence works. Look, for
> example, at the definition of TObject. The destructor is defined as 'destructor
> Destroy; virtual;'. The 'virtual' is the clue here. You must 'override' this
> method to get things to work propperly!! Your destructor needs to
> call 'inherited destructor' to have any chance at not leaking memory.
>
> destructor TStrings.Destroy;
> begin
> //whatever deallocation
>
>
> inherited; //also valid : 'inherited Destroy;'
> //like 'super' in java
> end;
>
>
> Naming your constructor as Init, whilst not technically incorrect, breaks
> naming conventions and will cause you endless problems if you should ever wish
> to derrive your class from somewhere else other than TObject. So, once
> interfaces come into play in 1.1, you would want to descend from
> TInterfacedObject, and not calling the inherited constructor could be a real
> problem. Another classic problem is TThread. Try creating a TThread descendent
> and overriding the constructor but not calling the inherited version. The
> thread never starts ;-) Got caught by that one a few times.
Thanks Matt :)
Be a lot of re-writing...
cheers
James
>
> Matt
>
> ---------------------------------------------
> This message was sent using Mistral WebMail.
> http://www.mistral.co.uk/
>
>
>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
More information about the fpc-pascal
mailing list