V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
tramm

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

  •  1
     
  •   tramm · Jul 2, 2023 · 2390 views
    This topic created in 1031 days ago, the information mentioned may be changed or developed.

    背景: 本人 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 replies    2023-07-03 18:24:57 +08:00
    westoy
        1
    westoy  
       Jul 2, 2023
    和 Go 没关系啊
    单独声明一个函数去做释放
    你这都返回了个野指针了
    learningman
        2
    learningman  
       Jul 2, 2023
    你 defer 的语句把这个指针对应的内存释放掉了
    jorneyr
        3
    jorneyr  
       Jul 3, 2023
    调用者负责释放。
    virusdefender
        4
    virusdefender  
       Jul 3, 2023
    return x 返回了一个指针,而指针对应的内存被 defer free 了
    0xWalker
        5
    0xWalker  
       Jul 3, 2023
    你的猜想是对的,自己释放掉了内存
    跟楼上说的一样,如果是这种实现,这块内存空间是由调用者去管理的
    当然你也可以调用者申请内存,在入参传入指针,Go 写入到该段内存空间
    freemoon
        6
    freemoon  
       Jul 3, 2023
    再写一个释放的函数?还是调用方直接释放
    bombless
        7
    bombless  
       Jul 3, 2023
    应该让 java 去分配一段内存然后把指针传递给你这个 jna 函数
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   993 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 19:31 · PVG 03:31 · LAX 12:31 · JFK 15:31
    ♥ Do have faith in what you're doing.