Это настраивается/отключается?
Где-то читал, что такое поведение необходимо, чтобы можно было приводить временные строки к PChar. Но я никогда не привожу временные строки к PChar, живущему дольше выражения, в котором он участвует, или вызова функции, аргументом которой является, ведь это опасно и не нужно!
- Код: Выделить всё
{$mode objfpc}
{$longstrings+}
uses
heaptrc;
function StrA: string;
begin
result := 'StrA';
end;
function StrB: string;
begin
result := 'StrB';
end;
procedure ProcessString(const s: string);
begin
writeln(s);
end;
procedure Leaks(var cp: jmp_buf);
begin
begin ProcessString(StrA + StrB); end;
longjmp(cp, 1); // Бдыщ! Теперь временная строка для StrA + StrB будет жить вечно.
end;
procedure DontLeaks(var cp: jmp_buf);
procedure WorkWithTemporaries;
begin
ProcessString(StrA + StrB);
end; // Здесь временная строка освободилась. Она бы освободилась, даже если бы я вернул на неё PChar.
// Так зачем ей вообще жить дольше скобок?
begin
WorkWithTemporaries;
longjmp(cp, 1);
end;
var
cp: jmp_buf;
begin
if setjmp(cp) = 0 then Leaks(cp);
if setjmp(cp) = 0 then DontLeaks(cp);
end.
→ 2 memory blocks allocated, 1 memory blocks freed.