Solved

a Free procedure call doesn't free (and nil) an object

Posted on 2003-10-22
5
229 Views
Last Modified: 2010-04-05
hi everyone,

i have the following problem :
i've created a TTimer descendent the following way :

interface

  TMyTimer = Class(TTimer)
                    ... various variables and TList Objects...
              public
                    constructor Create(aowner : TComponent);override;
                    destructor destroy; override;
              end;

var MyTimer : TMyTimer;

constructor TPopUpCampagne.Create(AOwner : Tcomponent);
Begin
     inherited Create(AOwner);
     ... several initializations including OnTimer affectation ...
End;

destructor TPopUpCampagne.destroy;
begin
     ... stuff to free memory...

     inherited destroy;
End;

then, further in the source code, i do the following (i want to destroy MyTimer to re-create it - instead of updating its data) :

if Assigned(Mytimer) then
   MyTimer.free;

...

MyTimer:=TMyTimer.Create(Nil);

the problem is that after the free call, the variable MyTimer isn't Nil - as expected ! but is still pointing to an existing object (and then my program throws an exception on another operation).

i've run the debugger and all the free calls in the object hierarchy are done.

Does anyone have an idea about what's happening ? and does anyone have a workaround ?
i could recreate the variable with the MyTimer:=TMyTimer.Create(Nil); but then i would have a memory leak...


thanks in advance,

Guillaume

PS : i put 150 points, cause it's important and i need a quick answer...
0
Comment
Question by:fsurfer
  • 4
5 Comments
 
LVL 27

Accepted Solution

by:
kretzschmar earned 150 total points
ID: 9597806
instead of

if Assigned(Mytimer) then
   MyTimer.free;

use

if Assigned(Mytimer) then
   FreeAndNil(MyTimer);

meikl ;-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 9597824
just for eplanation

>the problem is that after the free call, the variable MyTimer isn't
>Nil - as expected !

the referenceVariable is never set to nil after calling the free-method,
thats a normal bahaviour, you as developer have to care about this

meikl ;-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 9597853
btw. your timer is freed
0
 

Author Comment

by:fsurfer
ID: 9598092
Thanks for the answer !

it works perfectly !

i've always believe that free was doing a FreeAnd Nil....hmmmm there're always things to learn :)

Guillaume
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 9598159
glad to helped you ;-)
0

Featured Post

ScreenConnect 6.0 Free Trial

Check out the updates in one game-changing release, ScreenConnect 6.0, based on partner feedback. New features include a redesigned UI that improves session organization and overall user experience. See the enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Convert Jpg /PNG To GIF 5 138
Best Firemonkey component pack 1 106
Create Database on Android via Delphi dbExpress 3 95
Making delphi communicate with a c# service 16 104
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

831 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question