2009-05-06 4 views
10

Я думаю, что да, но 12 лучших примеров, которые я нашел все сделать что-то не иллюстративный какНужно ли очищать char *, переданный NewStringUTF?

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

Хорошо, что речь идет об утечках памяти, однако в этом случае утечки нет (исходный пример). «constant string» - буквальная строка; он не выделяется из кучи.

Итак, нет, вам не нужно очищать пройденный символ * (исходный пример).

Ваши отредактированные примеры лучше для иллюстрации вашей точки. В отредактированном примере да, вам нужно очистить переданную строку.

Смежные вопросы