Нужно ли мне очистить символ *, переданный в NewStringUTF?

StackOverflow https://stackoverflow.com/questions/827549

  •  05-07-2019
  •  | 
  •  

Вопрос

Я думаю, да, но все 12 лучших примеров, которые я нашел, делают что-то не иллюстративное, например

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

поэтому для потомков я спрошу:это плохо, да?

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

... и должно быть:

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;
}
Это было полезно?

Решение

ДА.(Просто чтобы это не выглядело оставшимся без ответа.)

Другие советы

Хорошо беспокоиться об утечках памяти, однако в этом случае утечек нет (оригинальный пример). " константна строка " является литеральной строкой; он не выделяется из кучи.

Итак, нет, вам не нужно очищать пройденный символ * (оригинальный пример).

Отредактированные примеры лучше иллюстрируют вашу точку зрения. В отредактированном примере да, вам нужно очистить переданную строку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top