I have a little problem (maybe in understanding) of the usage of the AnsiString. I use…
Show quoted text 14 lines
Possible cause is memory fragmentation. Please upgrade to 2.0.0 it has a rewritten memory manager.

Mailing lists / fpc-pascal / 2005-09
2 messages · 2 people ·
Reply by email Subscribe to this list Your subscription
Read-only archive. Use j and k to move between messages.
I have a little problem (maybe in understanding) of the usage of the AnsiString. I use…
Possible cause is memory fragmentation. Please upgrade to 2.0.0 it has a rewritten memory manager.
Dear all,
I have a little problem (maybe in understanding) of the usage of the AnsiString.
I use now FPC 1.0.6 (not updated yet to 2.0.0 as have fear that something in my old projects wont work)
I will get right on the point.
It seems to me that I can not use SA:=SA+'zzzzzzzzzzzzzzzzzzzzzzzzzz' large number of times repeatedly without draining my linux box out of RAM.
(SA here being ansi string)
For instance if I try to do
var SA:AnsiString;
SA:='';
for i:=1 to million do begin read(ch); SA:=SA+ch; end;
my Linux box with 512MByte of RAM will start swapping so terribly that
only reset can cure it.I do not know if this is my mis-understanding of the way the Ansi Strings use their reference count, but I really do not know how to add a short string to and ansi string large number of times without running out of ram.
It seems to me that the operation SA:=SA+ch duplicates the amount of allocated heap for the SA, and does not release the mem even after outside of the scope (proc).
I tried also
const large=say_100_thousand_for_the_sake_of_argument;
procedure sjfaksdjfhkasdf;
var SA,SA1:AnsiString;
s:string[255];
i:longint;
begin
sa:=''; sa1:=''; s:='zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
for i:=1 to large do begin
sa1:=sa + s;
sa:=sa1; sa1:='';
uniqueString(sa); uniqueString(sa1);
end;
end;
begin
sjfaksdjfhkasdf;
//here the program uses a lot of ram as I open another console
and do ps -auxc
readln;
end.
---please advice if you are not so busy thank you so much
thanxa and regards
andrej
test program below, eats 38 MByte of ram. (Linux box)
-------------------------------------------
procedure test_ansi;
var s:string[255]; //not ansi
SA:AnsiString;
li:longint;
begin
s:='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
//say 80
SA:='';
for li:=1 to 1000 do begin
SA:=SA+s;
end;
writeln('In proc now. length(SA)=',length(SA));
writeln('Choose another console and do "ps -auxc", note the memory
use');
//--- here my program has eaten 38 Mbytes, very hungry it is
readln;
end;
begin
writeln('In body start. Choose another console and do "ps -auxc",
note the memory use');
//here this program uses say 2 mbyte as per normal
readln;
test_ansi;
writeln('In body now. Choose another console and do "ps -auxc", note
the memory use');
//--- here my program has eaten 38 Mbytes, very hungry it is
readln;
test_ansi;
writeln('In body now. Second time Choose another console and do "ps
-auxc", note the memory
use');
readln;
end.
---------------------------------------------------------
eoc