gpt4 book ai didi

java - JNA 内存泄漏

转载 作者:可可西里 更新时间:2023-11-01 18:38:01 40 4
gpt4 key购买 nike

鉴于此 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);
}

还有这个 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 手动释放而不扩展它......

最佳答案

将此函数添加到 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++ 中分配和删除内存。

关于java - JNA 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9569530/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com