首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android如何正确释放C本机函数中分配的内存

Android如何正确释放C本机函数中分配的内存
EN

Stack Overflow用户
提问于 2014-05-05 08:03:13
回答 1查看 3.9K关注 0票数 1

我在我的Android应用程序中使用了大量的C内存分配。

为了避免任何内存泄漏,我想更好地理解JAVA垃圾收集器如何释放不再使用的内存。

当在JAVA中分配变量时,显然GC可以清除它。但是,当在C函数中进行分配时,我在其他文章中看到,JAVA有时可能不确定变量是否仍在使用,而且它永远不会被清除,从而导致mem泄漏。

请随时与评论,任何信息将丰富我们对内存分配和释放C本机函数的理解。我还添加了两个例子的代码,我想有您的意见。

谢谢大家!

示例:

代码1 -- new_string肯定不是内存泄漏,java能够垃圾收集str_to_return吗?

代码语言:javascript
复制
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?我们怀疑会有漏油。

代码语言:javascript
复制
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 );
}
EN

回答 1

Stack Overflow用户

发布于 2014-05-05 08:21:22

您使用的是NewStringUTF,它将new_string作为jstring返回。这个例程不知道new_string是如何分配的,所以它不会试图释放它。如果要修复内存泄漏,例程的调用方负责释放new_string。

代码语言:javascript
复制
/* 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;

如果它是常数,

代码语言:javascript
复制
/* free not required */
jstring retstr = (*env1)->NewStringUTF(env1, "Cannot be freed");
return retstr;

如果在堆栈上创建了字符串

代码语言:javascript
复制
/* free not required */
const char* stack_string = "on the stack";
jstring retstr = (*env1)->NewStringUTF(env1, stack_string);
return retstr;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23467667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档