Skip to content

Instantly share code, notes, and snippets.

@jaclas
Created May 2, 2018 19:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jaclas/0857421c1fd338fdf00eaf73d71936f5 to your computer and use it in GitHub Desktop.
Save jaclas/0857421c1fd338fdf00eaf73d71936f5 to your computer and use it in GitHub Desktop.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
FastMM4,
System.SysUtils,
System.Classes;
type
TRawMessageString = record
private
fStringData : RawByteString;
public
procedure LoadFromStream(const aStream : TBytesStream; const aLength : Integer);
procedure SaveToStream(const aStream : TBytesStream);
end;
procedure TRawMessageString.LoadFromStream(const aStream : TBytesStream; const aLength : Integer);
begin
SetLength(fStringData, aLength);
aStream.ReadBuffer(fStringData[1], aLength);
end;
procedure TRawMessageString.SaveToStream(const aStream : TBytesStream);
var
k: Integer;
begin
k := System.Length(fStringData);
if k > 0 then
begin
aStream.Write(fStringData[1], k); // <- FastMM4 pointed memory leak in this line
end;
end;
function GetMessage() : TRawMessageString;
var
i: Integer;
lStream: TBytesStream;
b: Byte;
begin
lStream := TBytesStream.Create();
try
//create fake message
for i := 0 to 99999 do
begin
b := Random(25) + 65;
lStream.Write(b, 1);
end;
lStream.Position := 0;
Result.LoadFromStream(lStream, lStream.Size);
finally
lStream.Free;
end;
end;
procedure InternalSendMessage(const aMessage : TRawMessageString);
var
lStream : TBytesStream;
begin
lStream := TBytesStream.Create();
try
aMessage.SaveToStream(lStream);
finally
lStream.Free;
end;
end;
procedure SendMessage(); overload;
var
lMsg: TRawMessageString;
begin
lMsg := GetMessage();
InternalSendMessage(lMsg);
end;
begin
try
SendMessage;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment