Problema de interoperabilidad de C and Go relacionado con C.free ()

Tengo una función Go que envuelve la función proc_name(pid,...) de lib_proc.h .

Este es el prototipo completo de C :

 int proc_name(int pid, void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); 

que se puede encontrar aquí / /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libproc.h / /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libproc.h (al menos en mi sistema).

Sigue el código Go:

 package goproc /* #include "libproc.h" int call_proc_name(int pid, char *name, int name_size) { return proc_name(pid, name, name_size); } */ import "C" import "unsafe" import "strings" type DarwinProcess struct { Process } func (DarwinProcess) NameOf(pid int) string { name := C.CString(strings.Repeat("\x00", 1024)) defer C.free(unsafe.Pointer(name)) nameLen := C.call_proc_name(C.int(pid), name, C.int(1024)) var result string if (nameLen > 0) { result = C.GoString(name); } else { result = "" } return result; } 

Este código no se comstackrá a menos que se C.free(unsafe.Pointer(...)) la llamada a C.free(unsafe.Pointer(...)) y la cláusula de import "unsafe" . DarwinProcess::NameOf(pid) está diseñado para funcionar solo en Mac OS X y , de hecho, funciona si C.free(...) se elimina del código.

En su forma real después de go build , aparece el siguiente mensaje de error: could not determine kind of name for C.free (y nada más, esta es la salida del comstackdor completo).

La eliminación de C.free(...) no es aceptable para mí, debo encontrar cómo liberar adecuadamente la memoria asignada con C.CString() .

Estoy desconcertado ya que, según la documentación , todo se hace correctamente. No he podido encontrar una solución ni buscar aquí ni en la web.

libproc.h no incluye stdlib.h , donde se declara free() . Como tal, el comstackdor no puede resolver el nombre. Después de agregar #include al principio del comentario de cgo, bloquee su código creado correctamente en mi sistema.