
Ну сам подумай...
String и Array - у нас динамические объекты одного типа. Будучи локальными, не требуют "ручного" перехвата исключений и вызова деструкторов (это делает паскаль безусловно, в т.ч. и перехват исключений).
Мы добавляем в свой TData поинтеры на "свои" динамические объекты - начинаем корячиться (причем не до конца чисто - исключений не перехватываем).
Вместо того, чтобы при введении MT честно завести счетчики ссылок, начинаем творить копии... Не вычистивши сохраненные в других элементах "хвосты" на уничтоженные данные
Криво все это

Фактически, нам нужен тип, аналогичный по функциональности встроенным string и array - ан дулю паскаль показывает.
Кладов попытался сделать чего-то похожее - TObj назвал. Так и там усё ручками делать надо...
А в результате, вместо того, чтобы просто увеличивать счетчики ссылок на Control, начинаем прилеплять к нему onDestroy ....
А, по теории, C++ как раз и сделан как инструмент для создания объектов пользователя
И как язык - довольно круто. Не знаю уж про реализации ...