Во-первых, AnsiString создаётся пустой.
Во-вторых, если строку нужно (пере)инициализировать заново, это делается безо всяких ZeroMemory:
Применение ZeroMemory ещё можно придумать при работе с PChar, но AnsiString всё делает самостоятельно.
slavon-x86
Утечки памяти нет только потому, что Вы сначала создаёте protocol (неинициализированный), потом его зачищаете FillChar'ом, и только потом присваиваете осмысленные значения. После чего процедура заканчивается, protocol удаляется из стека вместе со своими полями, и никакой памяти не теряется.
А попробуйте в другом порядке
Код:
protocol.s1 := IntToStr(random(999999));
protocol.s2 := IntToStr(random(999999));
FillChar(protocol, SizeOf(protocol), 0);
или сделайте protocol глобальной переменной. Потом запустите Task Manager, и посмотрите на потребление памяти.
P.S. Очень советую на время экспериментов
repeat заменить на
for с каким-нибудь скромным пределом, порядка сотни тысяч.