2009-05-06 40 views
10

我想是的,但前12名的例子,我發現所有做一些不一樣說明我需要清理傳遞給NewStringUTF的char *嗎?

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; 
} 

回答

10

是。 (只是所以這看起來沒有回答。)

3

這是很好的關注內存泄漏,但是,在這種情況下,沒有泄漏(原始示例)。 「常量字符串」是一個文字字符串;它不是從堆中分配的。

所以,不,你不需要清理char *通過(原始示例)。

您編輯的示例更適合說明您的觀點。在編輯的例子中,是的,你需要清理傳遞的字符串。

相關問題