Golang Go语言中CGO的C.CString该如何释放内存?
背景: 本人 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))
导致的.
有什么好的处理方法吗?
Golang Go语言中CGO的C.CString该如何释放内存?
更多关于Golang Go语言中CGO的C.CString该如何释放内存?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
和 Go 没关系啊
单独声明一个函数去做释放
你这都返回了个野指针了
更多关于Golang Go语言中CGO的C.CString该如何释放内存?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你 defer 的语句把这个指针对应的内存释放掉了
调用者负责释放。
return x 返回了一个指针,而指针对应的内存被 defer free 了
你的猜想是对的,自己释放掉了内存
跟楼上说的一样,如果是这种实现,这块内存空间是由调用者去管理的
当然你也可以调用者申请内存,在入参传入指针,Go 写入到该段内存空间
应该让 java 去分配一段内存然后把指针传递给你这个 jna 函数
在Go语言中使用CGO时,C.CString
用于将Go字符串转换为C风格的字符串(即以空字符结尾的字符数组)。由于C.CString
在C堆上分配内存,因此在使用完毕后需要手动释放这部分内存,以避免内存泄漏。
C.CString
返回的指针指向一个C字符串,你需要使用C语言的free
函数来释放这块内存。free
函数定义在<stdlib.h>
头文件中,通过CGO可以调用它。
下面是一个简单的示例,展示如何使用C.CString
并正确释放内存:
package main
/*
#include <stdlib.h>
*/
import "C"
import "unsafe"
func main() {
goStr := "Hello, CGO!"
cStr := C.CString(goStr)
defer C.free(unsafe.Pointer(cStr)) // 使用defer确保在函数返回前释放内存
// 在这里可以使用cStr进行C语言相关的操作
// ...
// 当main函数返回时,defer语句会自动执行,释放cStr指向的内存
}
在这个例子中,defer C.free(unsafe.Pointer(cStr))
确保了在main
函数结束前,C字符串的内存被正确释放。使用defer
是一个很好的实践,因为它可以确保即使发生错误,资源释放代码也会被执行。注意,unsafe.Pointer
用于在Go和C之间安全地转换指针类型。