Golang Go语言中CGO的C.CString该如何释放内存?

发布于 1周前 作者 itying888 来自 Go语言

背景: 本人 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

8 回复

和 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之间安全地转换指针类型。

回到顶部