Как я сказал, эта процедура вызывается при ВСЕХ присваиваниях строк.
Как раз старый указатель на Nil проверяется всегда. А поскольку у Вас там мусор - то и ошибка.
А в хелпе написано, что делается с НОВОЙ строкой. То есть создаётся новая строка, а если не получилось(Nil), то и вызывается EOutOfMemory.
По поводу того, что при выполнении шамашских действий начинает работать.
Мусорный указатель не всегда приводит к Access Violation. Или приводит, но не сразу. Или ошибка выскочит где-нибудь через час работы программы на ровном месте. В Вашем случае этот указатель мог совпасть с указателем на вот эту строку 'hello'. Поскольку она константная, счётчик у неё равен -1, а для таких строк FreeMem не вызывается.
И запомните - если программа работает правильно(или Вам так кажется), это не значит, что в ней нет ошибок.
|