I try to avoid ansistring as much as possible, and nearly all strings in my code are unicodestrings, with some widestrings where winapi is needed.
Still, that does not explain why finalization would even be called when program was never terminated.
Ansistring was just an example.
PascalDragon probably meant: any managed type.
And finalization has nothing to do with if your program terminates.
It probably has more to do, if a used managed Type goes out of scope.
As far as i understood it:
Unit1 uses Unit 2
Unit 2 uses Unit 3, which PROVIDES a managed type (e.g. UnicodeString).
Unit 2 does its calculations USING the type from Unit 3.
Unit 2 finishes its calculations and returns control back to Unit 1.
In that case Unit 2 would get an implicit finalization
At least that's how i understand it