On 02 Apr 2011, at 18:19, Jürgen Hestermann wrote:

> >> I would never expect an assignmet to nil changing anything else than just 
> >> the value of the pointer. And for (all?) other pointers this expectation 
> >> is valid.
> > That expectation is not valid for any reference counted type (be it a 
> > dynamic array, ansistring, unicodestring, COM-style interfaces). That's the 
> > whole point of reference counted types: they keep track of how many 
> > references still exist to the data, and once that reaches zero the data is 
> > freed.
> 
> But I just assign a value to a pointer,

No, you assign a value to a dynamic array. A dynamic array is not a plain 
pointer, just like a COM-style interface is not a plain pointer. Assigning nil 
to a COM-style interface does not set its value simply to nil either. There is 
also no difference between assigning the constant nil to a dynamic array 
variable and assigning a dynamic array with length 0 to a dynamic array 
variable (since empty arrays are also represented by a nil pointer, even if 
they are stored inside a variable).

> > The correct way to do so is to call initialize() on the field.
> 
> It's not mentioned in the documentation you refered to 
> (http://www.freepascal.org/docs-html/ref/refsu15.html#x39-450003.3.1).

The documentation for the initialize routine indeed seems to be missing.

> And I don't need any other routine because fillchar does the job.

Fillchar does the job just like adding inline assembler would do the job. It's 
a hack.

> The irritation just was, that I expected an assignment to nil doing exactly 
> the same as fillchar(..,#0). And I am still astonished that it does more. 
> What other traps are lurking under the hood? It's hard to program if you have 
> to fight with undocumented "features" instead of concentrating on my own 
> mistakes...


If you don't want the compiler to interfere with anything you do, do not use 
automated types such as ansistring, unicodestring, dynamic array and COM-style 
interfaces. The whole point of these types is that the compiler will do lots of 
stuff behind your back, because without that the reference counting cannot work.


Jonas_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to