用另一种语言包装C ++对象的策略 - 内存管理

时间:2015-11-12 14:38:23

标签: java c++ objective-c api

我有一个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缓存会使它们保持活动状态。

是否有更好/已知的策略来处理这种用例?

1 个答案:

答案 0 :(得分:0)

很高兴这已经为你解决了。

http://www.swig.org/

  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)