Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
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 - Fatal编程技术网

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 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时,是否有任何技巧可以避免内存泄漏。我必须处理这种类型,因为我不能对库资源进行任何更改 我会感谢你的帮助 编辑 我知道如何解决这个问题,但我不确定它

我包装这个联合,SWIG生成联合中所有字段的getter和setter

但当我运行SWIG时,我得到警告:

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改变这个,只有这个函数看起来像我想要的。我应该用些打字图还是别的什么