On zondag, feb 9, 2003, at 15:06 Europe/Brussels, Anton Tichawa wrote:

That's exactly what I meant: I'm not sure if fpc is able to keep track of the
destruction of the strings in case of AnsiString.
It is, as long as the type of the variable is clear when getmem/freemem is called (getmem also needs to know it, because if you use ansistrings, the memory must be cleared after it's allocated). What I mean is that

***
type
ta = array[0..9] of ansistring;
pa = ^ta;

var
p: pa;
begin
getmem(p,10*sizeof(ansistring));
readln(p^[0]);
freemem(p);
end;
***

Will correctly release all memory. If you change the freemem into

freemem(pointer(p));

however, then the memory allocated for the array will be freed, but the ansistring won't be finalized. This may seem strange at first sight, but it can occur when people construct generic datacontainers. It's one of the reason I dislike ansistrings and all the other things that require initialization/finalization: it completely breaks when you go low-level and as such it doesn't mix well with legacy Pascal code (and as your question indicates: it's not always clear at first sight whether a certain construct will behave correctly, you just have to know how far the compiler magic extends).


Jonas

_______________________________________________
fpc-pascal maillist - [EMAIL PROTECTED]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Reply via email to