[fpc-pascal] Constructors & Destructors 101

Richard Ward roward at mac.com
Fri Apr 3 03:43:46 CEST 2009


I am a little bit unclear about certain things on class constructors  
and destructors.

 From what I read in the language reference guide (chapter 6) and  
runtime utilities document (chapter 29):

1)	All classes descend from TObject; even declaring a new class  
without using TObject as a qualifier.

2)	TObject.Create is static (not declared virtual)

3)	TObject.Destroy is declared virtual

4)	Under most circumstances one should call the Free method to release  
an object since it checks for a nil pointer first.   This method then  
calls the destructor (Destroy) which, after executing your own clean  
up code if any, will then release the memory.  However, the object  
memory reference will not be set to nil.   Testing this out confirms  
this and the variable will still contain the memory address of the  
previously allocated memory block even though the memory block pointed  
to by the variable is not usable for anything.   To ensure that the  
address is set to nil, one should call the "global" sysutil function  
FreeAndNil , (chapter 30 RTL doc).   This routine sets the address to  
nil before calling the free method which then calls the destructor.

5)	Although I can't remember reading it anywhere, I've noticed from my  
own demo programs that the addresses of objects are initially set to  
nil.

If I have all of the above correct, then I have the following questions:


A)	The documentation says that for the create constructor:

(quote}
Description: Create creates a new instance of TObject. Currently it  
does nothing. It is also not virtual, so there is in principle no need  
to call it directly.
{unquote}

What is it meant by: "no need to call [create] directly?"  How do you  
invoke the constructor without calling it?  ... and ... Why is create  
not virtual and the destroy destructor is?

B)	The documentation says that for the destroy destructor:

(quote}
Description: Destroy is the destructor of TObject. It will clean up  
the memory assigned to the instance. Descendent classes should  
override destroy if they want to do additional clean-up. No other  
destructor should be implemented.
{unquote}

What is it meant by: "No other destructor should be  
implemented?"  ...and...  Does it do "something" while the Create  
constructor doesn't?

If you had two different create constructors (for whatever reason),  
might you not also need two different destroy destructors?   What  
problems might you get into if you did?

C)	Just out of curiosity, am wondering why FreeAndNil is global  
procedure instead of a method/destructor of TObject.   I am guessing  
it is for compatibility with Delphi which may or may not have a reason?

I had other curiosity questions but found a nice web page which covers  
the Delphi Object Model.

http://oreilly.com/catalog/delphi/chapter/ch02.html

I have gotten several basic programs to run without worrying about  
these questions, but wanted to make sure I am not going to get into  
trouble later with some subtle problem cropping up.   thanks for any  
information on this.  - ROW

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20090402/8bea962c/attachment.html>


More information about the fpc-pascal mailing list