gpt4 book ai didi

c++ - ReleaseStringUTFChars 给出 free() : invalid pointer: 0x0841a744 ***

转载 作者:行者123 更新时间:2023-11-28 03:48:09 25 4
gpt4 key购买 nike


我有一个 C++ 库,我正在编写 JNI 包装函数以允许我从 JAVA 调用它。我有很多不同的功能在工作,但我特别遇到一个问题。
我尝试封装的函数如下所示:

void Set_Name(std::string invar)

我有对 GetStringUTFChars 和 ReleaseStringUTFChars 的匹配调用,如下所示:

JNIEXPORT void JNICALL Java_com_metcarob_mys_javaapi_a_1SM_1D_1Orginisation_Set_1Name
(JNIEnv *p_jEnv, jobject p_jObj, jlong p_nat, jstring invar) {
SM_D_Orginisation* p_SMD = (SM_D_Orginisation*) p_nat;
const char *pPp_invar2 = p_jEnv->GetStringUTFChars( invar, NULL );
if (NULL==pPp_invar2) return;
std::string *pPp_invar = new std::string(pPp_invar2);
p_SMD->Set_Name(*pPp_invar);
pPp_invar2 = pPp_invar->c_str();
p_jEnv->ReleaseStringUTFChars(invar, pPp_invar2);
SAFE_DELETE(pPp_invar);
}

当我从 Java 运行此程序时,出现无效指针异常:

*** glibc detected *** /home/robert/Oracle/Middleware/jdk160_21/bin/java: free(): invalid pointer: 0x0841a744 ***
======= Backtrace: =========
/lib32/libc.so.6(+0x6b511)[0xf7637511]
/lib32/libc.so.6(+0x6ce1b)[0xf7638e1b]
/lib32/libc.so.6(cfree+0x6d)[0xf763bf8d]
/home/robert/Oracle/Middleware/jdk160_21/jre/lib/i386/client/libjvm.so(+0x34fc8c)[0xf703bc8c]
/home/robert/Oracle/Middleware/jdk160_21/jre/lib/i386/client/libjvm.so(+0x25139a)[0xf6f3d39a]
/home/robert/Encrypted/Projects/Scout_Management/smbackend/DEBUG/libjavaapi.so(_ZN7JNIEnv_21ReleaseStringUTFCharsEP8_jstringPKc+0x27)[0xe02475c9]
/home/robert/Encrypted/Projects/Scout_Management/smbackend/DEBUG/libjavaapi.so(Java_com_metcarob_mys_javaapi_a_1SM_1D_1Orginisation_Set_1Name+0xd8)[0xe0245467]
[0xf4c0105d]

如果我删除对 ReleaseStringURFChars 的调用,它可以正常工作。文档指出,每次调用 GetStringUTFChars 时我都必须调用 ReleaseStringUTFChars 以防止内存泄漏。

我不知道我做错了什么或我应该检查什么。
有人可以帮忙吗?
谢谢
罗伯特

最佳答案

你首先获取指针

const char *pPp_invar2 = p_jEnv->GetStringUTFChars( invar, NULL );

然后你重新分配指针

pPp_invar2 = pPp_invar->c_str();

必须先释放内存,再重新分配指针。

另外,你不需要用new分配pPp_invar然后删除它,一个简单的p_SMD->Set_Name(pPp_invar2); 应该足够了。

关于c++ - ReleaseStringUTFChars 给出 free() : invalid pointer: 0x0841a744 ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6725772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com