Показать сообщение отдельно
  #8  
Старый 14.03.2013, 11:57
Аватар для BBBCat
BBBCat BBBCat вне форума
Новичок
 
Регистрация: 10.03.2013
Сообщения: 73
Репутация: 10
По умолчанию

Сорри, электричество вырубали у нас
Ну наконец-то внятный ответ! А то все вопрос читают по диагонали Про строку - я это в курсе, а вот про SetString... Ну примерно так я и предполагаю, правда с одним 'но'. Хэлп из Delphi: For a long string variable, SetString sets S to reference a newly allocated string of the given length. И далее: If there is not enough memory available to create the string, an EOutOfMemory exception is raised. Following a call to SetString, S is guaranteed to reference a unique string, that is a string with a reference count of one. Т.е:
1)На Nil старый указатель не проверяется.
3)Счетчик ссылок не смотрится, а сразу устанавливается на единицу
7)Проверить на Nil новый указатель и
8)Если там Nil, то Exit - вот здесь-то и должно родиться EOutOfMemory
Про Access Violation ни слова. Т.е. исходя из хэлпа должно работать без FillChar(P^, SizeOf(TData), 0), а исходя из практики - так как вы отписали. Такая ситуация немного напрягает. А вдруг там ко всему вышесказанному ещё что-то есть. Поэтому хотелось бы точно знать, как SetString работает. В смысле на исходник глянуть. А у вас откуда все эти сведения?

Вот ещё что забыл: из сообщения icWasya рождается объясниние, почему во втором из приведённых мной здесь коде всё нормально срабатывает при добавлении
Код:
s := 'hello';
ShowMessage(s);
, а без этого выдаёт Access Violation. Во всех примерах здесь либо возникает ошибка, либо нет. А вот один из моих позавчерашних вариантов(там просто тестовая програмка, ничё не делает, чисто для проверки одного класса запускала его метод по нажатию кнопки) выдавал Access Violation на третий раз после запуска программы, а потом через каждые четыре раза на пятый. Делаешь выход из программы, запускаешь по-новой и опять на третий и каждый пятый. Я перезапускал Delphi, запускал EXE-шник без Delphi, перезагружал комп. Да чё-там - из розетки выдёргивал, когда спать ложился! Всё равно - на третий раз ошибка, а потом каждый пятый. Это как понять? Короче надо бы исходник. Или убедительное объяснение. А то не хочется потом, когда проект закончу, опять на начало возвращаться.
Ответить с цитированием