Je pense que oui, mais les 12 meilleurs exemples que j’ai trouvés font tous quelque chose de non illustratif, comme
JNIEXPORT jssortingng JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj) { return (*env)->NewSsortingngUTF(env, "constant ssortingng"); }
donc pour la postérité, je demanderai: c’est mauvais, oui?
JNIEXPORT jssortingng JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj) { char *leak = malloc(1024); leak[0] = '\0'; return (*env)->NewSsortingngUTF(env, leak); }
… et devrait être:
JNIEXPORT jssortingng JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj) { char *emptyssortingng = NULL; jssortingng r = NULL; emptyssortingng = malloc(1024); emptyssortingng[0] = '\0'; r = (*env)->NewSsortingngUTF(env, emptyssortingng); free(emptyssortingng); emptyssortingng = NULL; return r; }
Oui. (Juste pour que cela ne semble pas sans réponse.)
Il est bon d’être préoccupé par les memory leaks, cependant, dans ce cas, il n’y a pas de fuite (exemple initial). “chaîne constante” est une chaîne littérale; il n’est pas alloué à 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 propos. Dans l’exemple modifié, oui, vous devez nettoyer la chaîne transmise.