On Fri, Jul 24, 2020 at 4:25 PM burak serdar <bser...@computer.org> wrote:
>
> On Fri, Jul 24, 2020 at 5:21 PM Ian Lance Taylor <i...@golang.org> wrote:
> >
> > On Fri, Jul 24, 2020 at 4:07 PM Tony Yang <tonyy...@umich.edu> wrote:
> > >
> > > Hi Go community,
> > >
> > > I am wondering if a method with the pointer receiver keeps the receiver 
> > > instance from garbage collected.
> > >
> > > To put the idea into a code example
> > >
> > > ```
> > > type counter struct {
> > > c int
> > > }
> > >
> > > func (c *counter) next() int {
> > > c.c = c.c + 1
> > > return c.c
> > > }
> > >
> > > func getNextFunc() func () int {
> > > // Question: will c be garbage collected after the function retruns?
> > > c := &counter{}
> > > return c.next
> > > }
> >
> > The mere existence of a pointer receiver does not prevent a value from
> > being garbage collected.  In your example, if the counter value is
> > allocated on the heap in getNextFunc, that heap allocation can be
> > collected after getNextFunc returns (in practice in this example c
> > would be allocated on the stack, not the heap, anyhow).
>
>
> What is returned from the function is a method, though. Isn't that
> essentially a closure keeping a reference to c, and thus, c has to be
> allocated on the heap, and cannot be garbage collected until the
> returned function leaves the scope?

My apologies, I completely missed that you returned a method rather
than calling the method.

Yes, doing this will prevent c from garbage collected.  Otherwise it
would be impossible to call the returned function safely.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUDKr4BvRWdbtQKYqf8FZjcE4w5DBbDp-5DJcNG_apaiQ%40mail.gmail.com.

Reply via email to