pointers, assignments, Garbage Collection Oh My?

Jacob Carlborg doob at me.com
Wed Jul 10 10:32:14 PDT 2013


On 2013-07-10 19:18, JohnnyK wrote:
> I hope you like the subject matter and I hope it is not too simplistic
> or have been answered before.
>    Anyway I have a question about how the garbage collector works in a
> very specific situation.  When passing string type to a function in a
> shared library or DLL and assigning it to a variable of type string
> inside the function and returning the internal string.  Such as this.
>
> export string mytest(string tstStr)
> {
>    string st = tstStr;
>    /* abbreviated to protect the innocent but other operations
>       such as concatenating and deleting may be done to st before the
> return
>    */
>    return st;
> }
>
> Is the string type a pointer or is it something else?  In the line where
> tstStr is assigned to st does it copy the address in tstStr to st or
> does it copy the value in tstStr?  I am just a bit confused about string
> types since I come from a C background and C has no type like this.
> Also what is returned by this function?  Does this function return a
> pointer or the contents of an array?  If I do export this what does it
> do to the Garbage Collection?  Does the Garbage Collection collect
> tstStr or st? Also notice the comment in the function.

A string in D, and all arrays, is a struct looking like this:

struct Array (T)
{
     T* ptr;
     size_t length;
}

"string" happens to be an alias looking like this:

alias immutable(char)[] string;

That means you can do all operations on a string except assigning to 
specific elements:

string str = "foo";
str ~= "bar"; // ok
auto str2 = str ~ "foo"; // ok
str[0] == "f"; // ok
str[0] = 'a'; // error, cannot assign to immutable
auto str3 = str[1 .. 3]; // ok

It won't collect anything along as it is scope. If a variable goes out 
of scope and nothing else points to that data it will collect it 
(eventually).

Hope this helps a bit.

-- 
/Jacob Carlborg


More information about the Digitalmars-d-learn mailing list