2009-05-06 9 views
10

Creo que sí, pero los 12 mejores ejemplos que encontré todos hacemos algo no ilustrativa como¿Debo limpiar el char * pasado a NewStringUTF?

JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj) 
{ 
    return (*env)->NewStringUTF(env, "constant string"); 
} 

así para la posteridad voy a pedir: esto es malo, ¿verdad?

JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj) 
{ 
    char *leak = malloc(1024); 
    leak[0] = '\0'; 
    return (*env)->NewStringUTF(env, leak); 
} 

... y debe ser:

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

Respuesta

10

Sí. (Para que esto no parezca sin respuesta.)

3

Es bueno preocuparse por las pérdidas de memoria, sin embargo, en este caso, no hay fugas (ejemplo original). "cadena constante" es una cadena literal; no está asignado desde el montón.

Así que, no, no es necesario que limpie el carácter * pasado (ejemplo original).

Sus ejemplos editados son mejores para ilustrar su punto. En el ejemplo editado, sí, necesita limpiar la cadena pasada.