JNI освобождает память, чтобы избежать утечки памяти

Итак, у меня есть эта программа на C++, которая вызывается через JNI из моей Java-программы, Код следующий:

    JNIEXPORT jstring JNICALL Java_com_entrust_adminservices_urs_examples_authn_LdapAuthenticator2_takeInfo(JNIEnv *env, jobject obj, jstring domain, jstring id, jstring idca, jstring password) 
{
    const char *nt_domain;
    const char *nt_id;
    const char *nt_password;
    HANDLE hToken = 0;

    bool aut = false;

    nt_domain = env->GetStringUTFChars(domain, NULL);
    nt_id = env->GetStringUTFChars(id, NULL);
    nt_password = env->GetStringUTFChars(password, NULL);

      aut = LogonUser(nt_id, nt_domain, nt_password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken );

      /* release buffers */
    env->ReleaseStringUTFChars(domain, nt_domain);
    env->ReleaseStringUTFChars(id, nt_id);
    env->ReleaseStringUTFChars(password, nt_password);
    /* release the login handle */
    CloseHandle(hToken);

    if(aut)
    {
        return env->NewStringUTF("true"); 
    }

    DWORD dwError = GetLastError();
      LPVOID lpMsgBuf;

      FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR) &lpMsgBuf, 0, NULL );

    return env->NewStringUTF((const char*)lpMsgBuf); //returns the contents of lpMsgBuf (error)
}

в этой предпоследней строке jstring newString = env->NewStringUTF((const char*)otherString); никогда не освобождается, но возвращается, приведет ли это к возможной утечке памяти? есть ли способ обойти это?

также возможно, что вместо возврата строки Я возвращаю логическое значение (возвращаемое функцией LogonUser) вместо jstring и вместо этого добавляю рефрен "errormessage", который будет передан в методе, и обновить это? сможет ли моя Java-программа увидеть обновление для "errormessage"?

спасибо.

2 ответов


NewStringUTF() создает новую java.ленг.String -- другими словами, объект в куче Java, который будет собран, когда больше нет ссылок на него.

или вы спрашиваете о otherString? Я не знаю, что!--2--> делает, но похоже, что он выделяет память в куче C. Если это так, то да, вы должны явно освободить память.

Вы делаете свою жизнь сложнее, иногда установка otherString Строковой константы. Не делай этого. Вместо этого звоните NewStringUTF() внутри блоков вашего if / else, а во втором случае освободите родную строку C.


вам не нужно беспокоиться о памяти, выделенной NewStringUTF, поскольку об этом позаботится сборщик мусора Java.

но вы должны освободить lpMsgBuf при передаче FORMAT_MESSAGE_ALLOCATE_BUFFER в FormatMessage (т. е. вы должны использовать LocalFree для освобождения этого буфера), см. функция formatmessage документация.