<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I am a little bit unclear about certain things on class constructors and destructors.<div><br></div><div>From what I read in the language reference guide (chapter 6) and runtime utilities document (chapter 29):</div><div><br></div><div>1)<span class="Apple-tab-span" style="white-space: pre; ">      </span>All classes descend from TObject; even declaring a new class without using TObject as a qualifier.</div><div><br></div><div>2)<span class="Apple-tab-span" style="white-space: pre; ">     </span>TObject.Create is static (not declared virtual)</div><div><br></div><div>3)<span class="Apple-tab-span" style="white-space: pre; ">        </span>TObject.Destroy is declared virtual</div><div><br></div><div>4)<span class="Apple-tab-span" style="white-space: pre; ">    </span>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.</div><div><br></div><div>5)<span class="Apple-tab-span" style="white-space: pre; ">  </span>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.</div><div><br></div><div>If I have all of the above correct, then I have the following questions:</div><div><br></div><div><br></div><div>A)<span class="Apple-tab-span" style="white-space: pre; ">    </span>The documentation says that for the create constructor:</div><div><br></div><div>(quote}</div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">Description:</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">Create</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">creates a new instance of</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">TObject. Currently it does nothing. It is also not virtual, so</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> there is in principle no need to call it directly.</span></font></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">{unquote}</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">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?</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">B)<span class="Apple-tab-span" style="white-space: pre; ">       </span>The documentation says that for the destroy destructor:</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">(quote}</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">Description:</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">Destroy</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">is the destructor of</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">TObject. It will clean up the memory assigned to the instance. De</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><span class="Apple-style-span" style="font-size: 10px; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">scendent classes should override destroy if they want to do additional clean-up. No other destructor</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> <span class="Apple-style-span" style="font-size: 10px; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">should be implemented.</span></font><span style="font: normal normal normal 12px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "> </span></font></span></span></span></font></span></span></span></font></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">{unquote}</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><span class="Apple-style-span" style="font-size: 18px; ">What is it meant by: "<span class="Apple-style-span" style="font-size: 10px; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">No other destructor should be implemented?"  ...and...  Does it do "something" while the Create constructor doesn't?</span></font></span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">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?</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">C)<span class="Apple-tab-span" style="white-space: pre; ">    </span>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?</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">I had other curiosity questions but found a nice web page which covers the Delphi Object Model.</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><a href="http://oreilly.com/catalog/delphi/chapter/ch02.html">http://oreilly.com/catalog/delphi/chapter/ch02.html</a></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; ">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</span></font></div><div><br></div></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Helvetica; "><font class="Apple-style-span" size="5"><span class="Apple-style-span" style="font-size: 18px; "></span></font></div><font class="Apple-style-span" size="5"></font></div><font class="Apple-style-span" size="5"></font></div></div></body></html>