我在Android应用中使用了很多内存分配。
为了避免任何内存泄漏,我想更好地了解JAVA垃圾收集器如何释放不再使用的内存。
当在JAVA中分配变量时,很明显GC可以清除它。但是当在C函数中进行分配时,我已在其他帖子中读到JAVA有时可能无法确定变量是否仍在使用中,并且它永远不会被清除,从而导致内存泄漏。
请随时用评论任何可以丰富我们对内存分配和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 );
}
答案 0 :(得分:3)
您正在使用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;