我在我的Android应用程序中使用了大量的C内存分配。
为了避免任何内存泄漏,我想更好地理解JAVA垃圾收集器如何释放不再使用的内存。
当在JAVA中分配变量时,显然GC可以清除它。但是,当在C函数中进行分配时,我在其他文章中看到,JAVA有时可能不确定变量是否仍在使用,而且它永远不会被清除,从而导致mem泄漏。
请随时与评论,任何信息将丰富我们对内存分配和释放C本机函数的理解。我还添加了两个例子的代码,我想有您的意见。
谢谢大家!
示例:
代码1 -- new_string肯定不是内存泄漏,java能够垃圾收集str_to_return吗?
jstring
Java_com_example_adhocktest_SenderUDP_SendUdpJNI( JNIEnv* env,
jobject thiz)
{
char * new_string = (char*)malloc(sizeof(char)*200);
jstring str_to_return = (*env1)->NewStringUTF(env1, new_string);
free(new_string);
return (*env1)->NewStringUTF(env1, str_to_return);
}**代码2** -是否可以像在这里一样直接返回new_string?我们怀疑会有漏油。
jstring
Java_com_example_adhocktest_SenderUDP_SendUdpJNI( JNIEnv* env,
jobject thiz)
{
char * new_string = (char*)malloc(sizeof(char)*200);
return (*env1)->NewStringUTF(env1, new_string );
}发布于 2014-05-05 08:21:22
您使用的是NewStringUTF,它将new_string作为jstring返回。这个例程不知道new_string是如何分配的,所以它不会试图释放它。如果要修复内存泄漏,例程的调用方负责释放new_string。
/* free required here */
char* heap_string = (char*) malloc(sizeof(char) * 200);
strcpy(heap_string, "This is a heap string");
jstring retstr = (*env1)->NewStringUTF(env1, heap_string);
free(heap_string);
return retstr;如果它是常数,
/* free not required */
jstring retstr = (*env1)->NewStringUTF(env1, "Cannot be freed");
return retstr;如果在堆栈上创建了字符串
/* free not required */
const char* stack_string = "on the stack";
jstring retstr = (*env1)->NewStringUTF(env1, stack_string);
return retstr;https://stackoverflow.com/questions/23467667
复制相似问题