Devo ripulire il carattere * passato a NewStringUTF?
-
05-07-2019 - |
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;
}
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