Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JNI释放内存以避免内存泄漏 p>所以我有一个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) }_Java_C++_Memory Leaks_Java Native Interface - Fatal编程技术网

JNI释放内存以避免内存泄漏 p>所以我有一个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) }

JNI释放内存以避免内存泄漏 p>所以我有一个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) },java,c++,memory-leaks,java-native-interface,Java,C++,Memory Leaks,Java Native Interface,在倒数第二行jstringnewstring=env->NewStringUTF((constchar*)otherString)从未释放,但返回,是否会导致最终内存泄漏?有什么办法可以解决这个问题吗 还有可能不是返回一个字符串,而是返回一个布尔值(由LogonUser函数返回),而不是一个jstring,并在方法中添加一个要传递的“errormessage”引用,然后更新它吗?我的Java程序能看到“errormessage”的更新吗 谢谢。NewStringUTF()创建了一个新的java.

在倒数第二行
jstringnewstring=env->NewStringUTF((constchar*)otherString)
从未释放,但返回,是否会导致最终内存泄漏?有什么办法可以解决这个问题吗

还有可能不是返回一个字符串,而是返回一个布尔值(由LogonUser函数返回),而不是一个jstring,并在方法中添加一个要传递的“errormessage”引用,然后更新它吗?我的Java程序能看到“errormessage”的更新吗

谢谢。

NewStringUTF()
创建了一个新的java.lang.String——换句话说,java堆上的一个对象,当不再有对它的引用时,它将被收集

或者您是在询问关于
其他字符串的问题?我不知道
FormatMessage
做了什么,但看起来它在C堆上分配内存。如果是这样,那么是的,您必须显式地释放内存


有时将
otherString
设置为常量字符串,会让你的生活更加艰难。不要那样做。相反,在if/else的块内调用
NewStringUTF()
,在第二种情况下释放本机C字符串。

您不必担心NewStringUTF分配的内存,因为这将由Java垃圾收集器负责


C++,但是当你传递java格式的消息时,你必须释放LPMsgBUF(即你必须使用LoalALE来释放那个缓冲区),看看文档。

谢谢你的提示,如果你能查看一下你是否发现任何明显的错误(我是一个Java人现在在C++世界里工作),我就更新了代码。你似乎仍然没有释放lpMsgBuf。也许你不必这么做;我不知道FormatMessage()方法是否分配内存。谢谢kdgregory,据我所知,lpMsgBuf不需要释放,但如果其余内容正确,也不需要释放,再次感谢它:请参阅关于格式\u消息\u分配\u缓冲区的文档