SeZuka писал(а):Странно что операция p1:='xx'; не выделяет память сама. По моему надо либо вообще запретить присвоение указателю константы, либо чтобы константа копировалась с выделением памяти при присвоении указателю.
Для работы с PChar (и их вариациями) вообще нельзя использовать операции присваивания. Компилятор не ругается, но не нужно путать типы String и PChar. Паскалисты с древних времен привыкли к удобным строковым операциям, а сишники очень долго мудохались со строками, пока у них не появились аналоги типа std::String.
Так вот для работы с PChar нужно использовать StrCopy, StrNew и т.п. И вообще нужно использовать PChar как можно реже. Очень опасный тип, большинство косяков ОС и браузеров - это все от этого типа данных. Работая с этим типом данных в паскале мы получаем все косяки, на которые уже весь мир много лет наступает.
Добавлено спустя 3 минуты 23 секунды:SeZuka писал(а):А вот с этим костылем будем получать ошибки совсем в другом месте, а не там где их совершили.
Наоборот, мы получим исключение именно там, где находится логическая ошибка, а именно копирование без выделения памяти.
Делая StrCopy (StrPCopy) нужно десять раз подумать, что за память, которую мы пытаемся перетереть. Мы должны проверить сколько там выделено памяти и т.п. Вокруг этой операции нужно обвешать всякими там условиями и т.п.