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

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to