如何返回std :: vector <std :: pair <std :: string,int =“”>&gt;使用swig typemaps从java到c ++

时间:2015-09-11 18:55:03

标签: java c++ vector java-native-interface swig

我试图以

的形式将一些数据从java代码发送到c ++代码
std::vector<std::pair<std::string, int> >

使用SWIG。我使用以下.i文件:

%module example{

%include <std_pair.i>
%include <std_vector.i>
%include <std_string.i>

%template(Pair) std::pair<std::string , int>;
%template(VectorPair) std::vector<std::pair<std::string , int> >;

%}

在java中我做

VectorPair v = new VectorPair();
for (int j = 0; j < 100; j++){
         Pair temp = new Pair("some_string",j);
         v.add(temp);
      }

 v.delete();

在c ++中,我收到的是这样的:

void func(std::vector<std::pair<std::string , int> > A){
     //do something ....
     }

它工作正常,但事实证明每当我在Java中创建一个Pair或VectorPair时,我在c ++中复制并且我无法删除它们。所以当我在一个循环中重复这个时,我的内存耗尽。你能帮我删除这些副本或使用类型图来做这件事吗?

1 个答案:

答案 0 :(得分:1)

Java应该只是在完成时垃圾收集VectorPair,所以你需要做的就是说:

v = null;

确保您不在Java代码中保留对它的任何引用。

棘手的是Java不会意识到这个对象使用的真正内存,因为它没有看到默认情况下在C ++中发生了多少分配。这意味着即使应用程序存在内存压力,对象也不会被垃圾收集,因为JVM根本不知道存在这种压力。

因此,您要确保使用Java在C ++代码中进行所有分配,而不仅仅是Java特定的分配。 SWIG文档中有detailed instructions on using the JVM's heap。它的简短版本是你要编写operator new(当然还有相应的operator delete)来在JVM的堆上分配内存。

总的来说,你在这里按值传递矢量似乎很奇怪。传递const引用似乎更适合避免过多的复制/分配。