我试图以
的形式将一些数据从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 ++中复制并且我无法删除它们。所以当我在一个循环中重复这个时,我的内存耗尽。你能帮我删除这些副本或使用类型图来做这件事吗?
答案 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引用似乎更适合避免过多的复制/分配。