Domanda

Penso di si, ma i 12 migliori esempi che ho trovato fanno tutti qualcosa di non illustrativo come

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

quindi per i posteri chiederò: questo è male, sì?

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

... e dovrebbe essere:

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;
}
È stato utile?

Soluzione

Sì. (Solo così questo non sembra senza risposta.)

Altri suggerimenti

È bene preoccuparsi delle perdite di memoria, tuttavia, in questo caso, non vi sono perdite (esempio originale). "stringa costante" è una stringa letterale; non è allocato dall'heap.

Quindi no, non è necessario ripulire il carattere * passato (esempio originale).

I tuoi esempi modificati sono migliori per illustrare il tuo punto. Nell'esempio modificato, sì, è necessario ripulire la stringa passata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top