JNI释放内存以避免内存泄漏(JNI Freeing Memory to Avoid Memory

2019-07-21 07:52发布

所以我有一个通过JNI从我的Java程序中调用这个C ++程序,代码如下:

    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的” refrence在法获得通过,并更新了吗? 将我的Java程序能够看到一个更新“的ErrorMessage”?

谢谢。

Answer 1:

NewStringUTF()创建一个新的java.lang.String中-换句话说,在Java堆中的对象,当有它不再引用这将得到收集。

或者,你问otherString ? 我不知道是什么FormatMessage做,但它看起来像它在C堆中分配内存。 如果是这样的话,那么,你必须明确地释放内存。

您可以通过设置有时会打乱你的生活otherString成一个常量字符串。 不要那样做。 相反,调用NewStringUTF()的块中的if / else语句,并在第二种情况下释放本地C字符串。



Answer 2:

你不必担心被NewStringUTF分配作为将由Java垃圾收集器被照顾的记忆。

但是你要释放lpMsgBuf为您传递FORMAT_MESSAGE_ALLOCATE_BUFFER到的FormatMessage(即你必须使用LocalFree释放该缓冲区),看到的FormatMessage文档。



文章来源: JNI Freeing Memory to Avoid Memory Leak