Я отвечу как на общий вопрос, так и на конкретный пример.
JNA не поддерживает никаких ссылок на собственную память, если вы сами не выделите ее в JNA (например, определите массив byte[]
илиMemory
буфер, который вы передаете функции). В этих случаях собственная память освобождается, когда объект Java собирается мусором.
Если вы не передаете какую-либо память для заполнения C, JNA не собирается ничего делать с собственной памятью, ивам нужно прочитать документацию API, чтобы увидеть, какова ваша ответственность за освобождение нативной строки.
Тип Ctring C ++ не обязательно должен быть освобожден , если он не сохранен в новом объекте . Тем не менее, Go реализует CString
как объект и документирует эти требования. Для вашего конкретного примера, документы говорят:
Распределение памяти, выполненное кодом C, не известно менеджеру памяти Go. Когда вы создаете строку C с C.CString (или любым выделением памяти C), вы должны не забыть освободить память, когда закончите с ней, вызвав C.free.
и из cgo wiki :
Важно помнить, что C.CString () выделит новую строку соответствующей длины и вернет ее. Это означает, что строка C не будет собираться мусором, и вы можете ее освободить. Стандартный способ сделать это следующим образом.
// #include <stdlib.h>
import "C"
import "unsafe"
...
var cmsg *C.char = C.CString("hi")
defer C.free(unsafe.Pointer(cmsg))
// do something with the C string
Конечно, вы не обязаны использовать defer для вызова C.free (). Вы можете освободить строку C, когда захотите, но вы обязаны убедиться, что это произойдет.