L505 wrote:
The reference count is part of the ansistring itself. An ansistring
is simply a pointer to a record containing a reference count, the
amount of memory currently allocated for the string (i.e., maximum
length -1) and the string itself (a 0-terminated string).

So when passing a string from a dll to somewhere else, its reference
count is passed along with it.



Instead of asking all the newbie questions, I will do more reading about 
reference
count science on my own too.. but if it's easy for you to tell me here, how 
does the
reference count know ahead of time that there will be no usage of the string 
when it
sets the reference count to 0? i.e. how is the reference count decremented? 
Does the
compiler know this at compile time?


In short (don't pin me on the names or on exact details in special cases):

Assume you have a ansistring and you assign something to it

  S := 'SomeString';

the compiler generates something like

  DecStringRef(S);
  S -> 'SomeString';
  IncStringRef(S);

The DecStringRef() decrements the refcount and checks if the it reaches zero. Ifso, the string is freed. The referencecounter of a strings lies in memory just before the actual text. Thats why you cannot pass a @S to a procedure which expects a textbuf. In that case you pass @S[1], the adress of the first character.

THis decrefcount is also the reason that you shouldn't pass strings to a dll. Suppose the string is created in your main app en passed to a dll. As soon as a DecStringRef is called (and the reference reaches 0) the code executes in your dll, So the freeing of the string is also done in the dll (and a free memblock is added to the dll instead of the app)

Marc


_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to