Чи слід викликати ReleaseStringUTFChars, якщо GetStringUTFChars повернув копію?


74

Книга "Essential JNI: Java Native Interface" Роба Гордона містить наступний приклад коду для перетворення jstring у рядок C:

const char* utf_string;
jboolean isCopy;
utf_string = env->GetStringUTFChars(str, &isCopy);
/* ... use string ... */
if (isCopy == JNI_TRUE) {
    env->ReleaseStringUTFChars(str, utf_string);
}

Зверніть увагу, що він дзвонить, лише ReleaseStringUTFCharsякщо isCopyістина.

Але книга Java Native Interface: Посібник та специфікація програміста (альтернативне посилання http://192.9.162.55/docs/books/jni/html/objtypes.html#5161:) говорить:

Виклик ReleaseString-Chars необхідний, якщо GetStringChars встановив * isCopy на JNI_TRUE або JNI_FALSE. ReleaseStringChars або звільняє копію, або відкріплює екземпляр, залежно від того, повернув GetStringChars копію чи ні.

Я правильно вважаю, що це помилка в книзі Гордона?


2
де strвизначено?
SomethingSomething

Відповіді:


63

Так, ваше припущення правильне (ви завжди повинні викликати ReleaseStringUTFChars).


Що станеться, якщо його не буде викликано?
Бульма

1
Пам'ять просочиться (JVM вважатиме, що пам'ять вам потрібна на невизначений час).
Бретт Кейл

2
Звичайно! Але чому ми не маємо вільно виділеної функції пам’яті для інших типів даних, таких як: int, double. Це має бути RealseInt (arg, arg), ReleaseDouble (arg, arg) ... або щось подібне?
Бульма

4
Int та double не є змінною довжиною, як рядки, тому дані можна тривіально скопіювати до абонента. (Напевно, краще створити нове запитання, а не продовжувати розмову на 6-річну відповідь.)
Бретт Кейл,

1
Дякую! Я зрозумів.
Бульма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.