SWIG const char*setter 我使用C++编写的用java语言编写的共享库的Java包装器。在库中有一个类似于以下内容的联合: union Union{ int f_int; double f_double; bool f_bool; const char* f_string; MyObject* f_my_object; };
我包装这个联合,SWIG生成联合中所有字段的getter和setter 但当我运行SWIG时,我得到警告:SWIG const char*setter 我使用C++编写的用java语言编写的共享库的Java包装器。在库中有一个类似于以下内容的联合: union Union{ int f_int; double f_double; bool f_bool; const char* f_string; MyObject* f_my_object; };,java,c++,swig,setter,Java,C++,Swig,Setter,我包装这个联合,SWIG生成联合中所有字段的getter和setter 但当我运行SWIG时,我得到警告: Warning 451: Setting a const char * variable may leak memory. 我理解为什么会这样,因为SWIG文档中有一个解释:(第5.5.4章) 我的问题是:在包装const char*type时,是否有任何技巧可以避免内存泄漏。我必须处理这种类型,因为我不能对库资源进行任何更改 我会感谢你的帮助 编辑 我知道如何解决这个问题,但我不确定它
Warning 451: Setting a const char * variable may leak memory.
我理解为什么会这样,因为SWIG文档中有一个解释:(第5.5.4章)
我的问题是:在包装const char*type时,是否有任何技巧可以避免内存泄漏。我必须处理这种类型,因为我不能对库资源进行任何更改
我会感谢你的帮助
编辑
我知道如何解决这个问题,但我不确定它是否正确。但首先,要了解更多有关问题的细节:
SWIG为const char*union成员setter生成C代码,如下所示:
SWIGEXPORT void JNICALL Java_example_exJNI_Union_1f_1string_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) {
Union *arg1 = (Union *) 0 ;
char *arg2 = (char *) 0 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(Union **)&jarg1;
arg2 = 0;
if (jarg2) {
arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0);
if (!arg2) return ;
}
{
if (arg2) {
arg1->f_string = (char const *) (new char[strlen((const char *)arg2)+1]);
strcpy((char *)arg1->f_string, (const char *)arg2);
} else {
arg1->f_string = 0;
}
}
if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2);
}
SWIGEXPORT void JNICALL Java_example_exJNI_Union_1f_1string_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) {
Union *arg1 = (Union *) 0 ;
static std::string* arg2_ = new std::string();
const char *arg2 = (const char *) 0 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(Union **)&jarg1;
arg2 = 0;
if (jarg2) {
arg2 = (const char *)jenv->GetStringUTFChars(jarg2, 0);
if (!arg2) return ;
}
{
if (arg2) {
&(arg2_)->assign(arg2);
jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2);
arg1->f_string = arg2_->c_str();
} else {
arg1->f_string = 0;
}
}
}
问题在于:
arg1->f_string = (char const *) (new char[strlen((const char *)arg2)+1]);
正如SWIG文件所述:
当声明const char*类型的变量时,SWIG仍然生成用于设置和获取值的函数。但是,默认行为不会释放以前的内容(导致可能的内存泄漏)
因此,我认为我应该强制SWIG生成如下所示的C代码:
SWIGEXPORT void JNICALL Java_example_exJNI_Union_1f_1string_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) {
Union *arg1 = (Union *) 0 ;
char *arg2 = (char *) 0 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(Union **)&jarg1;
arg2 = 0;
if (jarg2) {
arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0);
if (!arg2) return ;
}
{
if (arg2) {
arg1->f_string = (char const *) (new char[strlen((const char *)arg2)+1]);
strcpy((char *)arg1->f_string, (const char *)arg2);
} else {
arg1->f_string = 0;
}
}
if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2);
}
SWIGEXPORT void JNICALL Java_example_exJNI_Union_1f_1string_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) {
Union *arg1 = (Union *) 0 ;
static std::string* arg2_ = new std::string();
const char *arg2 = (const char *) 0 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(Union **)&jarg1;
arg2 = 0;
if (jarg2) {
arg2 = (const char *)jenv->GetStringUTFChars(jarg2, 0);
if (!arg2) return ;
}
{
if (arg2) {
&(arg2_)->assign(arg2);
jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2);
arg1->f_string = arg2_->c_str();
} else {
arg1->f_string = 0;
}
}
}
它解决了内存泄漏问题吗?我想是的,但也许我忽略了什么
我想知道如何强制SWIG改变这个,只有这个函数看起来像我想要的。我应该用些打字图还是别的什么