Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Go CString的JNA空闲内存是否返回值_Java_Jna_Cgo - Fatal编程技术网

Java Go CString的JNA空闲内存是否返回值

Java Go CString的JNA空闲内存是否返回值,java,jna,cgo,Java,Jna,Cgo,我有这样一个JNA接口: 接口JJ{ 字符串Hello(GoString.ByValue sql); } Go中对应的本机代码: //出口你好 func Hello(ss字符串)*C.char{ s:=ss+“世界” 返回C.CString(s) } 本机代码返回指向字符串的指针 JNA代码是否释放本机代码分配的字符串指针? 如果没有,如何释放它?我将回答一般问题和具体示例 除非您自己在JNA中分配本机内存(例如,定义传递给函数的byte[]数组或memory缓冲区),否则JNA不会维护

我有这样一个JNA接口:


接口JJ{
字符串Hello(GoString.ByValue sql);
}
Go中对应的本机代码:


//出口你好
func Hello(ss字符串)*C.char{
s:=ss+“世界”
返回C.CString(s)
}
本机代码返回指向字符串的指针

JNA代码是否释放本机代码分配的字符串指针?
如果没有,如何释放它?

我将回答一般问题和具体示例

除非您自己在JNA中分配本机内存(例如,定义传递给函数的
byte[]
数组或
memory
缓冲区),否则JNA不会维护对本机内存的任何引用。在这些情况下,当Java对象被垃圾收集时,本机内存被释放

如果您没有将任何内存传递给C来填充,那么JNA不会对本机内存做任何事情,您必须阅读API文档,以了解释放本机字符串的责任

不一定需要释放C++ cSnpe类型。但是,Go确实将

CString
作为一个对象来实现,并记录这些需求。对于您的特定示例,请说:

由C代码进行的内存分配对于Go的内存是未知的 经理使用C.CString(或任何C内存)创建C字符串时 分配)完成后,必须记住释放内存 打免费电话给C

从以下方面:

需要记住的一件重要事情是C.CString()将分配 创建适当长度的新字符串,并返回它。这意味着C 字符串不会被垃圾收集,这取决于您自己 释放它。下面是执行此操作的标准方法

/#包括
输入“C”
进口“不安全”
...
var cmsg*C.char=C.CString(“hi”)
延迟C.free(不安全指针(cmsg))
//用C字符串做些什么
当然,您不需要使用defer来调用C.free()。你可以 随时释放C字符串,但这是您的责任 确保它发生


让Java分配缓冲区,让它为您释放缓冲区。。否则,您必须自己释放它并导出释放函数

public interface JJ {
    JJ lib = (JJ)Native.loadLibrary("jj.so", JJ.class);

    void Hello(byte[] sql);
}

func Hello(ss []byte) {
    copy(ss[:], string(ss) + " world")
}
用法:

void main(String[] args) {
    byte[] text = new byte[256];

    JJ.lib.Hello(text);

    System.out.println(Native.toString(text));
}
您可以将整个内容包装到一个通用函数中,该函数将为任何给定的本机函数创建一个字符串。。但你明白了

  • Java分配缓冲区,Go Lang填充缓冲区,Java自动释放缓冲区
  • Go-Lang分配缓冲区,Java使用它,Go-Lang释放它

  • 在这两种情况下,分配缓冲区的人都必须释放缓冲区。

    正如CString复制并分配一个需要显式释放的新字符串,因此它不会在堆栈上分配infact@pdeva谢谢,我已经更新了我的答案。我不知道这是否是围棋的特点。我的回答是基于。可能是Go内部调用了
    新的
    变量。
    void main(String[] args) {
        byte[] text = new byte[256];
    
        JJ.lib.Hello(text);
    
        System.out.println(Native.toString(text));
    }