2009-05-06 5 views
10

Je pense que oui, mais les 12 premiers exemples que j'ai trouvé tous faire quelque chose non illustrative commeDois-je nettoyer le caractère * transmis à NewStringUTF?

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

donc pour la postérité, je demanderai: cela est mauvais, oui?

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

... et devrait être:

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

Répondre

10

Oui. (Juste pour que cela ne semble pas sans réponse.)

3

Il est bon d'être préoccupé par les fuites de mémoire, cependant, dans ce cas, il n'y a pas de fuite (exemple original). "chaîne constante" est une chaîne littérale; il n'est pas affecté à partir du tas.

Donc, non, vous n'avez pas besoin de nettoyer le caractère * passé (exemple original).

Vos exemples édités sont meilleurs pour illustrer votre point. Dans l'exemple modifié, oui, vous devez nettoyer la chaîne transmise.

Questions connexes