Thanks your reply, you mean I should be release the memory of `theCArray`
in C side?
I still have some doubts, and I made a clearer example as the below, any
problem with it?
So, the memory of this tmpslice should be release by release the argv on C
side?
func GoStrings(length int, argv **C.char) []string {
tmpslice := (*[1 << 30]*C.char)(unsafe.Pointer(argv))[:length:length
]
gostrings := make([]string, length)
for i, s := range tmpslice {
gostrings[i] = C.GoString(s)
defer C.free(unsafe.Pointer(s))
}
return gostrings
}
在 2017年8月17日星期四 UTC+8下午8:41:48,Konstantin Khomoutov写道:
>
> On Thu, Aug 17, 2017 at 03:32:28AM -0700, [email protected]
> <javascript:> wrote:
>
> > As the instruction
> > of https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
> > shows, the GC of Go will not release it.
> > An example as the following, but I have a question about when and how to
> > release this `slice`?
>
> You shouldn't: the GC won't touch the memory it does not "own" so it
> will eventually collect the slice structure itself but won't do anything
> to its underlying array (which value you obtained via that double
> type-conversion).
>
> You should supposedly be instead concerned with freeing the array's
> memory (via calling C.free or some dedicated function to do this
> provided by your C side, if any). As always with C, you should only do
> that if that getTheArray() function's semantics are such that its caller
> "owns" the memory the function returns.
>
> > import "C"
> > import "unsafe"
> > ...
> > var theCArray *C.YourType = C.getTheArray()
> > length := C.getTheArrayLength()
> > slice := (*[1 <<
> 30]C.YourType)(unsafe.Pointer(theCArray))[:length:length]
> >
> >
> > It is important to keep in mind that the Go garbage collector will not
> > > interact with this data, and that if it is freed from the C side of
> things,
> > > the behavior of any Go code using the slice is nondeterministic.
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.