Иногда API сохраняет указатель до более позднего времени.Например, подумайте об асинхронном вводе-выводе.
Или, если вы написали код, подобный следующему, он тоже потерпит неудачу:
function Broken():PChar;
var s:string;
begin
s:=IntToStr(Random(100));//no string constant
return PChar(s);
end;
Один важный момент - если вы приведете строку с refcount> 1на PChar
, он создаст копию, а затем передаст вам строку с refcount = 1.Таким образом, ваш PChar
становится недействительным, как только введенные вами значения становятся недействительными, даже если у него был refcount> 1.
Еще один неработающий пример:
var p:PChar;
var s:string;
s := IntToStr(Random(100));//no string constant
p := PChar(s);
s := "ABC";
DoSomething(p);//p is invalid by now