我有一个C ++库,我想要所有的核心逻辑发生。我想用不同的语言(例如Objective C和Java)为它创建包装器,这将是暴露给开发人员的唯一接口。
我面临的问题是包装器对象的内存管理。
考虑C ++对象:
class Node {
public:
std::vector<std::shared_ptr<Node>> children;
void addChild(std::shared_ptr<Node> node);
}
让我们假设我有一个Java对象JNode盲目地包装Node,传递所有内容。
public void doSomething() {
JNode node = new JNode();
someOtherNode.addChild(node);
}
当此方法返回时,Java对象将被销毁,但是C ++对象将由std :: shared_ptr保持活动状态。
现在稍后,说我想遍历某个节点的子节点。它们相应的Java对象已丢失,因此我需要在每次访问时重新创建它们。如果开发人员保留了对原始Java对象的引用,这看起来很昂贵并且可能会造成混淆,而现在这些对象现在将会有所不同。
我已经想到了缓存Java对象的想法,但是由于C ++方面可能正在创建新节点而没有相应的Java对象这一事实使这变得更加复杂。它还使内存管理变得困难,因为C ++端可能会删除节点,使得没有剩余的引用,但Java缓存会使它们保持活动状态。
是否有更好/已知的策略来处理这种用例?
答案 0 :(得分:0)
很高兴这已经为你解决了。
SWIG是一个软件开发工具,它将用C和C ++编写的程序与各种高级编程语言连接起来。 SWIG与不同类型的目标语言一起使用,包括常见的脚本语言,如Javascript,Perl,PHP,Python,Tcl和Ruby。支持的语言列表还包括非脚本语言,如C#,Common Lisp(CLISP,Allegro CL,CFFI,UFFI),D,Go语言,Java,包括Android,Lua,Modula-3,OCAML,Octave,Scilab和R还支持几种解释和编译的Scheme实现(Guile,MzScheme / Racket,Chicken)