Question

Je pense que oui, mais les 12 meilleurs exemples que j'ai trouvés font tous quelque chose qui n'est pas illustratif, comme

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

donc pour la postérité, je vais demander: c'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;
}
Était-ce utile?

La solution

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

Autres conseils

Il est bon de s’inquiéter des fuites de mémoire. Cependant, dans ce cas, il n’ya 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 d'origine).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top