Java 我需要清理传递给NewStringUTF的字符*吗?
我想是的,但我发现的前12个例子都没有说明问题,比如Java 我需要清理传递给NewStringUTF的字符*吗?,java,java-native-interface,Java,Java Native Interface,我想是的,但我发现的前12个例子都没有说明问题,比如 JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj) { return (*env)->NewStringUTF(env, "constant string"); } 所以对于子孙后代,我会问:这很糟糕,是吗 JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, job
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
return (*env)->NewStringUTF(env, "constant string");
}
所以对于子孙后代,我会问:这很糟糕,是吗
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
char *leak = malloc(1024);
leak[0] = '\0';
return (*env)->NewStringUTF(env, leak);
}
…而且应该是:
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
char *emptystring = NULL;
jstring r = NULL;
emptystring = malloc(1024);
emptystring[0] = '\0';
r = (*env)->NewStringUTF(env, emptystring);
free(emptystring);
emptystring = NULL;
return r;
}
对。(这样看起来就不会没有答案了。)关注内存泄漏是很好的,但是,在这种情况下,没有泄漏(原始示例)。“常量字符串”是一个文本字符串;它不是从堆中分配的 因此,不需要,您不需要清除传递的char*(原始示例) 你编辑的例子更能说明你的观点。在已编辑的示例中,是的,您需要清理传递的字符串