Как правильнее создавать объект верхнего уровня?:
такWidget Base;
или Widget *Base = new Widget;
Попробуйте сделать первое, а затем поместить этот виджет в контейнер или родительское окно, я прошлым летом от этого отказался, точно не помню почему, но вроде как виджет не должен появиться, так как для этого ему надо покинуть область видимости, а статически выделенные переменные при этом освобождаются.
И как происходит освобождение всей иерархии, которая наследуется от Base?
В контейнере, то есть в родительском контроле или окне - там, куда вы помещаете ссылку на него.
Проще говоря, при закрытии окна вызывается деструктор из central widget, он в свою очередь - у дочерних контролов и т.д., получается конечная рекурсия.
Должно быть так.
но тогда нужно ли освобождать?
Стало быть, должно быть не нужно, но если провели эксперимент, посмотрели исходный код и видите, что такого нет, то просто реализуйте все это вручную при закрытии.