JNI 内存从字节数组泄漏
JNI memory leak from byte array
我有一个Java程序,可以多次调用本机函数。我的问题是这个函数有内存泄漏,我为摆脱它所做的一切都会导致内存转储。任何帮助将不胜感激。
这是我的代码
JNIEXPORT void JNICALL Java_class_method_getInput
(JNIEnv *env, jobject obj)
{
if (inputIsAvailable)
{
int size = getBufferCurrentIndex();
size -= getBufferReadIndex();
size *= 2;
char *finalSendArray = new char[size];
getCommand(finalSendArray);
jbyteArray byteArray = env->NewByteArray(size / 2);
env->SetByteArrayRegion(byteArray, 0, size / 2, (jbyte*) finalSendArray);
while(methodID == 0)
{
jclass cls = env->GetObjectClass(obj);
methodID = env->GetMethodID(cls, "setCommand", "([B)V" );
}
env->CallVoidMethod(obj, methodID, byteArray);
//env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
我的问题是上面的 ^ 代码如果未注释会导致内存转储,如果未取消注释,我的程序在几分钟内耗尽内存
env->DeleteLocalRef(byteArray);
delete[] finalSendArray;
}
}
任何帮助将不胜感激。谢谢!
如果使用JNI_ABORT参数,ReleaseByteArrayElements也会释放内存。因此,当您稍后执行删除和释放时,其中一个指针指向导致转储的未初始化内存。
其中一个会起作用,我相当确定它是第一个有效的。
env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
delete[] finalSendArray;
如果第一个失败,请尝试此操作。
env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
env->DeleteLocalRef(byteArray);
在 ReleaseByteArrayElements 之后放一个 print 语句,你会看到你的程序正在执行超出该命令并在 Release/Delete[] 上崩溃。
搜索"表 4-10 基元阵列释放模式"
相关文章:
- 为什么调用堆栈数组会导致内存泄漏
- 为什么并行读取数组会导致内存泄漏?
- C++中的动态数组:Valgrind泄漏
- 模板化动态数组上的内存泄漏
- 温度参数数组的内存泄漏
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- 瓦尔格林德内存泄漏与动态数组C++
- 如何修复Valgrind报告的C 数组驱动器中的内存泄漏
- 返回指针(数组)(C++)时可能出现内存泄漏
- 带有指针的 2D 数组中的内存泄漏
- 内存泄漏 C++ 数组列表
- 从堆中删除c++数组和内存泄漏
- 由于动态数组而导致的哈希映射内存泄漏
- 如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为
- Valgrind在定义字符*数组时报告内存泄漏
- char*数组内存泄漏
- 使用float 2d数组的C++内存泄漏,如果我使用double,则会消失
- 返回导致内存泄漏的wchar_t数组
- JNI 内存从字节数组泄漏