Сначала немного лирики.
Даже если отбросить экзотику-архаику типа pString, array[1..N]of char и забить на shortString, остаются три (якобы легко совместимых взаимно) ходовых строковых типа: string и pChar. Три - потому что pChar'ов ДВА: pChar, созданный через GetMem - не то же, что pChar, создаваемый StrAlloc'ом! И смешивать два подхода к распределению-освобождению памяти под pChar чревато AV'шкой: если память выделялась через StrAlloc, то освобождать нужно не FreeMem(p), а FreeMem(p-SizeOf(cardinal)) - а лучше, конечно, StrDispose(p). В обратную сторону (т.е. вызовом StrDispose отдать выделенное через GetMem), кажется, вообще никак.
А теперь конкретные вопросы.
1) Можно ли отличить один pChar от другого, кроме как методом тыка и try-except?
2) Нужно в строку pChar записать строку string. Ессно, p:=pChar(s) не подходит: содержимое p будет валидно только на время жизни s. (Если не ошибаюсь, такое присваивание не увеличит счётчик ссылок s. Или ошибаюсь?).
Ничего менее громоздкого, чем
- Код: Выделить всё
if Assigned(p)
then try
StrDispose(p)
except
FreeMem(p)
{случаи, когда pChar получался присваиванием string'а или массива символов, для простоты проигнорирую}
end;
p:=StrAlloc(Length(s)+1); {или +1 не надо?}
StrPCopy(p,s)