Why is Destroy not called?

You must mark the signature of destructor with override.

destructor Destroy(); override;

And you should have inherited at the end of the destructor. But since your class is not derived from anything other than TObject I suspect that doesn't matter.


Destroy is virtual, and therefore you must override it in your descendant class.

TFoo = class
  Bar : TBar;

  constructor Create();
  destructor Destroy(); override; // must add override here
end;

Without the override, your destructor is never called, and the base class one is instead.