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;
}
Foi útil?

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
scroll top