Hi, When using cgo its my understanding that strings created with C.CString must be freed with C.free, but yet numeric types do not need to be explicitly freed.
Firstly, is CString a special case here, or are there other types that need to be explicitly freed as well? Secondly, Im writing a lot of wrappers to cgo functions that will requiring converting go 'string' arguments in the outer function, into C.String arguments in the cgo inner function. Im looking for a simple way to ensure that I dont create any memory leaks. In view of this I have an idea to wrap the CString in a go struct and set the finalizer to free the CString : // -------------------------------------- wrapped.go -------------------------------------- package golasso import ( // #include <stdlib.h> "C" "fmt" "runtime" "unsafe" ) type WrappedString struct { s *C.char } func FreeWrappedString(s *WrappedString) { fmt.Print("Freeing WrappedString") C.free(unsafe.Pointer(s.s)) } func NewWrappedString(s string) WrappedString { wrappedString := WrappedString{s: C.CString(s)} runtime.SetFinalizer(&wrappedString, FreeWrappedString) return wrappedString } // -------------------------------------- func simulatedCCall(s *C.char) { fmt.Print("simulated C call") } // -------------------------------------- wrapped_test.go -------------------------------------- package golasso import ( "runtime" "testing" ) func TestWrapped(t *testing.T) { simulatedCCall(NewWrappedString("fred").s) t.Logf("simulated C call") runtime.GC() } NB: I do realise that, in a production scenario, it might be a long time before the GC runs and therefore a long time before the GC calls the finalizer to free the CString. Im not so worried about this, as my primary concern is ensuring that *every* CString is definitely going to be freed at some point, and therefore I have no *true* memory leaks. What are the pros/cons of this? Is it even correct? Is there an easier way to achieve this? Andy -- 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. For more options, visit https://groups.google.com/d/optout.