fork download
  1. program ideone;
  2. {$mode delphi}{$h+}
  3.  
  4. uses SysUtils;
  5.  
  6. // Auxiliary function to extract reference count.
  7. function SRefCount(P : Pointer) : integer;
  8.  
  9. Type
  10. PAnsiRec = ^TAnsiRec;
  11. TAnsiRec = Record
  12. CodePage : TSystemCodePage;
  13. ElementSize : Word;
  14. {$ifdef CPU64}
  15. { align fields }
  16. Dummy : DWord;
  17. {$endif CPU64}
  18. Ref : SizeInt;
  19. Len : SizeInt;
  20. end;
  21. begin
  22. if P=Nil then
  23. Result:=0
  24. else
  25. Result:=PAnsiRec(P-SizeOf(TAnsiRec))^.Ref;
  26. end;
  27.  
  28. type
  29. TARCrecord = record
  30. nm : string;
  31. v : integer;
  32. end;
  33.  
  34.  
  35. procedure testFail(const s : string);
  36. var
  37. r1 : TARCrecord;
  38. r2 : TARCrecord;
  39. begin
  40. writeln('sref1 = ', SREfCount(pointer(s)));
  41. r1.nm := s;
  42. writeln('sref2 = ', SREfCount(pointer(s)));
  43. r1.v := 5;
  44. Move(r1, r2, sizeof(r1));
  45. //r2:=r1;
  46. writeln('sref3 = ', SREfCount(pointer(s)));
  47. writeln(r2.nm);
  48. end;
  49.  
  50.  
  51.  
  52. var
  53. s : string;
  54. begin
  55. (* your code goes here *)
  56. s:='number is: '+IntToStr(random(1000));
  57. testFail(s);
  58. writeln('sref4 = ', SREfCount(pointer(s)));
  59. writeln(s);
  60. writeln('sref5 = ', SREfCount(pointer(s)));
  61. end.
Runtime error #stdin #stdout 0s 5548KB
stdin
Standard input is empty
stdout
sref1 = 1
sref2 = 2
sref3 = 2
number is: 548
sref4 = 0

sref5 = 1022402872