11

はいと思いますが、私が見つけた上位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;
}
4

2 に答える 2

9

はい。(これが未回答に見えないようにするためです。)

于 2009-05-20T19:43:07.200 に答える
3

メモリリークを気にするのはいいのですが、この場合はリークしていません(元の例)。「定数文字列」はリテラル文字列です。ヒープから割り当てられません。

したがって、いいえ、渡された char * をクリーンアップする必要はありません (元の例)。

あなたの編集された例は、あなたの要点を説明するのに適しています。編集された例では、はい、渡された文字列をクリーンアップする必要があります。

于 2010-12-29T01:55:30.937 に答える