V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
tramm
V2EX  ›  Go 编程语言

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

  •  1
     
  •   tramm · 2023-07-02 22:25:13 +08:00 · 1579 次点击
    这是一个创建于 495 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景: 本人 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))导致的.

    有什么好的处理方法吗?

    7 条回复    2023-07-03 18:24:57 +08:00
    westoy
        1
    westoy  
       2023-07-02 22:38:58 +08:00
    和 Go 没关系啊
    单独声明一个函数去做释放
    你这都返回了个野指针了
    learningman
        2
    learningman  
       2023-07-02 22:45:03 +08:00
    你 defer 的语句把这个指针对应的内存释放掉了
    jorneyr
        3
    jorneyr  
       2023-07-03 08:16:43 +08:00
    调用者负责释放。
    virusdefender
        4
    virusdefender  
       2023-07-03 09:54:57 +08:00
    return x 返回了一个指针,而指针对应的内存被 defer free 了
    0xWalker
        5
    0xWalker  
       2023-07-03 11:12:31 +08:00
    你的猜想是对的,自己释放掉了内存
    跟楼上说的一样,如果是这种实现,这块内存空间是由调用者去管理的
    当然你也可以调用者申请内存,在入参传入指针,Go 写入到该段内存空间
    lasuar
        6
    lasuar  
       2023-07-03 16:28:42 +08:00
    再写一个释放的函数?还是调用方直接释放
    bombless
        7
    bombless  
       2023-07-03 18:24:57 +08:00
    应该让 java 去分配一段内存然后把指针传递给你这个 jna 函数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2450 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:41 · PVG 23:41 · LAX 07:41 · JFK 10:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.