هل أنا بحاجة لتنظيف شار * تمريرها إلى 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