# Garbage collector for string arrays

**URL:** <https://discourse.julialang.org/t/garbage-collector-for-string-arrays/17597>\
**Category:** General Usage\
**Tags:** embedding\
**Created:** [November 16, 2018, 2:54pm UTC](https://discourse.julialang.org/t/garbage-collector-for-string-arrays/17597 "2018-11-16T14:54:58Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![hhaensel](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/hhaensel/32/1207_2.png) [@hhaensel](https://discourse.julialang.org/u/hhaensel)\
**Post date:** [November 16, 2018, 2:54pm UTC](https://discourse.julialang.org/t/garbage-collector-for-string-arrays/17597/1 "2018-11-16T14:54:58Z")

</div>

I have generated several strings in the C api via `jl_cstr_to_string(x)` and pushed them to the gc stack.  
Then I create an array of strings by passing an array of the respective string pointers.  
Now the critical question:  
Can I release the single string variables from the gc stack after having created the array?  
One could hope that the GC now cares about the array and the array contains the references to the strings.

```julia
ReDim s(1 To 3) As String
s(1) = "Hello"
s(2) = "World"
s(3) = "!"

JL_GC_PUSH VarPtr(jl_a) '# rooting of the Julian string array
JL_GC_PUSHARGS jl_p, 3 '# rooting of the array of Julian string pointers

For i = 1 To 3 ' # create Julian strings from C pointers
    jl_p(i - 1) = jl_cstr_to_string(s(i))
Next

jl_a_type = jl_apply_array_type(jl_string_type, 1)
jl_a = jl_ptr_to_array_1d(jl_a_type, VarPtr(jl_ss(0)), 2, 0) '# own_buffer = 0 as I am still in charge of jl_a

JL_GC_POP '# unroot the jl_p array ... ????

'# do something with a, e.g. trigger the garbage collector
'# by requiring huge memory
jl_eval_string "collect(1:10_000_000)"
MsgBox jl_typeof_str(jl_a) '# returns a pointer, so the variable is still alive in Julia
MsgBox jl_typeof_str(jl_p(0)) '# returns a pointer, so the variable is still alive in Julia
    
JL_GC_POP '# unroot jl_a

jl_eval_string "collect(1:10_000_000)"
MsgBox jl_typeof_str(jl_a) '# returns 0, so the variable was deleted
MsgBox jl_typeof_str(jl_p(0)) '# returns 0, so the variable was deleted

```

I found the solution myself by testing, but I think, others might still enjoy the example …  
So my conclusion is, the single variables can be unrooted. But in order to work, `jl_a` has to be rooted first, as the GC is a LiFo buffer.  
P.S.: Sorry for using VB syntax, but hey, Julia also works in Excel 😉
