gpt4 book ai didi

java - 如何使用 swig 类型映射将 std::vector> 从 Java 返回到 C++

转载 作者:行者123 更新时间:2023-11-30 05:39:00 24 4
gpt4 key购买 nike

我正在尝试以

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

使用痛饮。我使用以下 .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++ 中创建一个拷贝,但我无法删除它们。因此,当我循环重复此操作时,我会用完内存。你能帮我删除这些重复项或使用类型映射来执行此操作吗?

最佳答案

Java 应该在 VectorPair 完成后对其进行垃圾回收,所以您需要做的就是说:

v = null;

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

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

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

一般而言,您在这里按值传递 vector 似乎很奇怪。通过 const 引用传递似乎更适合避免过度复制/分配。

关于java - 如何使用 swig 类型映射将 std::vector<std::pair<std::string, int>> 从 Java 返回到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530349/

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