Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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 JNA内存泄漏 给出了C++代码: void LoadData(char** myVar) { std:: string str("[Really Long String Here]"); unsigned int size = str.length() + 1; *myVar = new char[size]; strncpy(*myVar, str.c_str(), size); }_Java_C++_C_Jna - Fatal编程技术网

Java JNA内存泄漏 给出了C++代码: void LoadData(char** myVar) { std:: string str("[Really Long String Here]"); unsigned int size = str.length() + 1; *myVar = new char[size]; strncpy(*myVar, str.c_str(), size); }

Java JNA内存泄漏 给出了C++代码: void LoadData(char** myVar) { std:: string str("[Really Long String Here]"); unsigned int size = str.length() + 1; *myVar = new char[size]; strncpy(*myVar, str.c_str(), size); },java,c++,c,jna,Java,C++,C,Jna,这个JNA Java: Pointer myVar = new Memory(Pointer.SIZE); this.Lib.LoadData(myVar); this.someVar = myVar.getPointer(0).getString(0); 据我所知,我有内存泄漏,getPointer(0)应该创建一个指针对象,该对象应该在finalize()上释放,但似乎没有 我错过什么了吗?这似乎符合规格。。。并且我可以运行上面的函数,没有C++中的漏洞。 我在一个循环中调用Java代码来

这个JNA Java:

Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
据我所知,我有内存泄漏,getPointer(0)应该创建一个指针对象,该对象应该在finalize()上释放,但似乎没有

我错过什么了吗?这似乎符合规格。。。并且我可以运行上面的函数,没有C++中的漏洞。 我在一个循环中调用Java代码来测试泄漏,我尝试了暂停,并手动调用GC,这样它会很快膨胀到千兆字节

几天来,我一直在为此绞尽脑汁,在尝试释放内存这样琐碎的事情上挂断电话真是糟糕透了。据我所知,只有在我有地址的情况下,我才能用Java手动释放内存,但我不知道该怎么做

编辑:

没关系,我甚至不认为有一种方法可以在不扩展JNA的情况下通过JNA手动释放…

而不是 myVar=新字符[大小]

使用

需要删除阵列,如下所示: 删除[]*myVar


JNA prolly不知道该怎么做。

分配给调用者,而不是被调用者

例如:

int LoadData(char* buf, int maxlen) {
    std:: string str("[Really Long String Here]");
    strncpy(buf, str.c_str(), maxlen);
    if (str.length() < maxlen) 
        return str.length();
    return maxlen;
}
int-LoadData(char*buf,int-maxlen){
std::string str(“[此处的字符串非常长]”);
strncpy(buf,str.c_str(),maxlen);
if(str.length()

然后,当您从Java调用时,传入适当大小的
字节[]
。请注意,这种实现可能是非常低效的,但其思想是,一般不想在一个上下文中分配内存,而将其分配到另一个上下文中。

< P>将此函数添加到C++库…

void FreeData(char** myVar)
{
    delete [] *myVar;
}
然后将其作为JNA代码

Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
this.Lib.FreeData(myVar);

这种方式在C++中分配和删除内存。

仍然泄漏,同样迅速。(在实现中:char*buf可以是10字节、10k或150k,在我实现完整代码后可能会更多。除了分配一些MEG和忍受低效的实现之外(我的软件可以,但我更感兴趣的是如何使用JNA实现这一点)。如果您希望被叫方管理存储,您可以返回“const char*”,JNA会将内容复制到Java字符串中,然后您可以安全地修改缓冲区内容和/或删除它。如果您返回指针,您可以避免内存复制,直到Java端实际需要查看数据。执行此操作的“正确”方式在很大程度上取决于哪些部分(Java或本机)您的程序的一部分需要访问数据,缓冲区的使用频率和使用时间。到目前为止,这似乎是可行的,但JNA中真的没有其他方法释放数据吗(JNA只是本机库的包装器。它不管理本机内存,尤其是直接本机缓冲区。本机库设计器的任务是提供接口来分配/释放库使用的内存。JNA确实有释放内存的内部方法,奇怪的是,我不得不再次实现它,因为它都受到保护在JNA中。@StrangeWill可能是因为它的引用没有被GC释放来接管它就像使用Windows内核32的
heapolloc()
从堆中分配内存一样,我们需要使用
HeapFree()来释放它
。如果我们在C中有一个内存分配函数,那么它还必须附带一个内存释放函数。
Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
this.Lib.FreeData(myVar);