Preciso limpar o caractere * passado para NewStringUTF?
-
05-07-2019 - |
Pergunta
Eu acho que sim, mas o top 12 exemplos que eu encontrei tudo fazer algo não ilustrativo como
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
return (*env)->NewStringUTF(env, "constant string");
}
então para a posteridade vou perguntar: isso é ruim, sim
JNIEXPORT jstring JCALL Java_com_foo_dumbImpl(JNIEnv* env, jobject thisObj)
{
char *leak = malloc(1024);
leak[0] = '\0';
return (*env)->NewStringUTF(env, leak);
}
... e deve ser:
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;
}
Solução
Sim. (Só para isso não parece sem resposta.)
Outras dicas
É bom se preocupar com vazamentos de memória, no entanto, neste caso, não há nenhum vazamento (exemplo original). "String constante" é uma string literal; não é alocada a partir do heap.
Então, não, você não precisa limpar o caractere * passado (exemplo original).
Seus exemplos editados são melhores para ilustrar o seu ponto. No exemplo editado, sim, você precisa limpar a string passada.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow