JNI释放内存以避免内存泄漏
所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下:
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);中,从不释放而是返回,是否会导致最终的内存泄漏" title="内存泄漏">内存泄漏?反正有解决这个问题的方法吗?
还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“
errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的更新?
谢谢。
回答:
NewStringUTF()
创建一个新的java.lang.String-换句话说,就是Java堆上的一个对象,当不再有对其的引用时,它将被收集。
还是您在问otherString
?我不知道该怎么办FormatMessage
,但看起来它正在C堆上分配内存。如果是这样,那么是的,您必须显式释放该内存。
有时设置otherString
为常量字符串会使您的生活更加艰难。不要那样做 相反,请NewStringUTF()
在if /
else的块中调用,然后在第二种情况下释放本机C字符串。
以上是 JNI释放内存以避免内存泄漏 的全部内容, 来源链接: utcz.com/qa/407152.html