JNA内存泄漏
JNA Memory Leak
给定此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++fine中运行上面的函数而不会泄漏。
我在循环中调用Java代码来测试泄漏,我尝试过暂停,并手动调用GC,这样它也会很快膨胀到千兆字节。
几天来,我一直在思考这个问题,被一些琐碎的事情所困扰,比如试图释放内存,真是太糟糕了。据我所知,如果我有地址,我只能在Java中手动释放内存,但我不知道该怎么得到。
编辑:
无论如何,我甚至不认为有一种方法可以在不扩展JNA的情况下通过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++中分配和删除内存。
分配给调用者,而不是被调用者。
例如:
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;
}
然后,当您从Java调用时,传入一个适当大小的byte[]
。请注意,这种实现可能效率非常低,但其想法是,您通常不希望在一个上下文中分配内存,而在另一个上下文中将其释放。
而不是myVar=新字符[size]
使用
*myVar = malloc(size);
strncpy(*myVar, str.c_str(), size);
需要删除的数组如下:删除[]*myVar;
JNA显然不知道该怎么做。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存