CGO 的 C.CString 该如何释放内存?

314 天前
 tramm

背景: 本人 Javer,Go 只是新手,使用 Go 打包 dll 给 C#/Java 调用.

export 的方法大概如下:

//export GmDecrypt
func GmDecrypt1(dataStrC *C.char, privateKeyC *C.char) *C.char {
	x := C.CString("xxx")
	defer C.free(unsafe.Pointer(x))
	return x
}

发现在 C#/Java 中调用后获取到的值是乱码,猜测可能是C.free(unsafe.Pointer(x))导致的.

有什么好的处理方法吗?

1392 次点击
所在节点    Go 编程语言
7 条回复
westoy
314 天前
和 Go 没关系啊
单独声明一个函数去做释放
你这都返回了个野指针了
learningman
314 天前
你 defer 的语句把这个指针对应的内存释放掉了
jorneyr
314 天前
调用者负责释放。
virusdefender
314 天前
return x 返回了一个指针,而指针对应的内存被 defer free 了
0xWalker
314 天前
你的猜想是对的,自己释放掉了内存
跟楼上说的一样,如果是这种实现,这块内存空间是由调用者去管理的
当然你也可以调用者申请内存,在入参传入指针,Go 写入到该段内存空间
lasuar
314 天前
再写一个释放的函数?还是调用方直接释放
bombless
314 天前
应该让 java 去分配一段内存然后把指针传递给你这个 jna 函数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/953497

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX