title: Is there, besides hunting for memory leaks, another situation where I should free all objects when destroying an application?
body: <p>Suppose an application with some forms and only one data module are created at start.
  In the <code>DM1.OnCreate</code> event, a <code>TStringList</code> is created to be used at runtime.
  We know that when the application is being terminated, all things will be destroyed and memory will automatically freed. Freeing something can take some time, and so is not always advised to worry about memory leaks on shutdown. See for example <a href="https://stackoverflow.com/a/1203219/460775">this answer</a> from Barry Kelly or <a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx" rel="nofollow noreferrer">this post</a> from Raymond Chen.</p>
  
  <p>Beside that, FastMM reports the memory leak if I don't add <code>TStringList.Free</code> to <code>DM1.OnDestroy</code>. This turns out to be a problem when searching for any other memory leaks that I should <em>really</em> worry about.</p>
  
  <p>So basically I am asking if/why/when I should free object instances that will be freed by application or OS (Windows in this specific case). Is there any other valid case that is not when hunting for memory leaks?</p>
  
  <p><strong>NOTE</strong>: In this specific case, the data module is not created or recreated more times. There will not be any memory leak at all, besides the one. The data module scrap source:</p>
  
  <pre><code>unit UDM1;
  
  interface
  
  uses SysUtils, Classes, ...;
  
  type
    TDM1 = class(TDataModule)
      procedure DataModuleCreate(Sender: TObject);
      procedure DataModuleDestroy(Sender: TObject);
      procedure DoStuffWithStringList1(Sender: TObject);
    private
      internalStL: TStringList;
    end;
  
  var
    DM1: TDM1;
  
  implementation
  
  procedure TDMInterfacePAFECF.DataModuleCreate(Sender: TObject);
  begin
    internalStL := TStringList.Create();
  end;
  
  procedure TDMInterfacePAFECF.DataModuleDestroy(Sender: TObject);
  begin
    internalStL.Free; //&lt;-- IS THIS NECESSARY OR ADVISED?
  end;
  
  procedure DoStuffWithStringList(Sender: TObject);
  begin
    //Place some code using internalStL here...
  
  end;
  </code></pre>