Показать сообщение отдельно
  #7  
Старый 14.03.2013, 10:19
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Потому что строка в Дельфи - это объект с автоматическим временем жизни и подсчётом ссылок. В константно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.
Ответить с цитированием