[fpc-pascal] Generic a "Clone" method
Martin Friebe
fpc at mfriebe.de
Tue Jun 16 18:42:37 CEST 2009
Torsten Bonde Christiansen wrote:
> Martin Friebe wrote:
>>
>> If any member (object variable) is of a ref-counted type (that is
>> strings and dynamic arrays), then any "memory copy" will mess up.
>>
>> Because in the objects memory, there only are the pointers to the
>> data of strings, and dyn-arrays. If you copy those pointer by hand,
>> then the reference-counts in the actual string or dyn-array are not
>> updated.
>> this leads to at least 2 problems.
>>
>> 1)
>> If the original object was the only holder (or last remaining) of a
>> reference to this string, and your original or new object is
>> destroyed, the ref-count goes down to zero => the string is freed,
>> and the other object points to unallocated memory, or meory allocated
>> to some new/other data) => crash
>>
>> 2)
>> Again if, your old object was the only holder, then the ref-count is
>> still 1. Strings are "copy on modify", => 2 copies of a string share
>> memory until one is changed (in which case a copy is made). The need
>> for making the copy is determined by ref-count > 1.
> Can this be avoided by using the "UniqueString(..)" method?
>
If you know where the strings are...; but then it's no longer unique.
You can try something else, but i have no idea where it leads too, or if
its usable (in objpas mode)
type
TFoo = object
private
public
end;
Acts like a record, with methods, kind of.....
anyway
var a, b: TFoo
a:=b;
Takes care of everything.
BUT those "objects" are like records. they do not allocate ne meory,
each time you create them, they alloc mem when you *declare* them
if you pass them to a function in the arg list, they get copied. ( with
"class" the pointer gets copied, because class is in reality a pointer.
So you could declare
TRealFoo = ^TFoo;
then write your constructor to return the pointer,
every access would need the dereference of course => massive change to
syntax.
and so on.
If it is for you, you have to RT(F)M yourself....
Martin
More information about the fpc-pascal
mailing list