Нужно ли убирать символ *, переданный в NewStringUTF? - PullRequest
10 голосов
/ 06 мая 2009

Я думаю, что да, но лучшие 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;
}

Ответы [ 2 ]

10 голосов
/ 20 мая 2009

Да. (Только чтобы это не выглядело без ответа.)

3 голосов
/ 29 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...