问题:用ctypes 调用编译好的dll/so,直接返回cstring出现内存泄露。
定位出的问题点:defer unfree只适用于不返回时候用,有返回结果不能直接返回string bytes。
解决方案:应该先返回地址,然后解析地址中的值,再在调用的go程序中用free方式,把地址释放,下面是解决后的代码:
go文件的代码:
//export OsGet
func OsGet(url *C.char, headers *C.char, IpPort *C.char) unsafe.Pointer {
//defer C.free(unsafe.Pointer(resString))
url_s := C.GoString(url)
headers_s := C.GoString(headers)
ipport_s := C.GoString(IpPort)
res := get(url_s, headers_s, ipport_s)
resb, _ := json.Marshal(res)
length := make([]byte, 8)
binary.LittleEndian.PutUint64(length, uint64(len(resb)))
resString := C.CBytes(append(length, resb...))
return resString
}
//export FreeCString
func FreeCString(b unsafe.Pointer) {
C.free(b)
}
python中代码:
GET = quotes.