Потому что строка в Дельфи - это объект с автоматическим временем жизни и подсчётом ссылок. В константно1 строке счётчик равен -1, во вновь созданной - 0;
Любое присваивание в строку - это:
1)Проверить, на Nil старый указатель.
2)Если там Nil, то перейти на 6)
3)Проверить счетчик ссылок, если там не 1, то перейти на 5)
4)Освободить память, занимаемую строкой, перейти на 6)
5)Если счётчик не -1, то уменьшить счётчик
6)Собственно присвоить новый указатель
7)Проверить на Nil новый указатель
8)Если там Nil, то Exit
9)Проверить счётчик. Если там не -1, то увеличить счётчик.
В многопоточном режиме добавляются Interlocked операции
Строковые локальные переменные процедур и поля классовых переменных после конструкторов инициализируются Nil`ами.
GetMemory осуществляет только заказ памяти и ничем его не прописывает. Поэтому на шаге 1) у Вас будет не Nil, а на шаге 4) - Access Violation.
|