我有一个C++库,我希望所有的核心逻辑都发生在这个库中。我想为它创建不同语言的包装器(例如。Objective C和Java),这将是向开发人员公开的唯一接口。
我面临的问题是包装器对象的内存管理。
考虑C++对象:
class Node {
public:
  std::vector<std::shared_ptr<Node>> children;
  void addChild(std::shared_ptr<Node> node);
}让我们假设我有一个Java object JNode,它盲目地包装Node,传递所有内容。
public void doSomething() {
  JNode node = new JNode();
  someOtherNode.addChild(node);
}当此方法返回时,Java对象将被销毁,但std::shared_ptr将使C++对象保持活动状态。
现在,稍后,假设我想遍历某个节点的子节点。它们对应的Java对象已经丢失,所以我需要在每次访问时重新创建它们。如果开发人员保留了对原始Java对象的引用,这看起来代价很高,而且可能会让人感到困惑,现在这些对象将有所不同。
我曾尝试过缓存Java对象的想法,但由于Java端可能会创建新的节点,而这些节点没有相应的C++对象,这一点变得更加复杂。这也使得内存管理变得困难,因为Java端可能会删除节点,这样就没有剩余的引用,但C++缓存会让它们保持活动状态。
有没有更好的/众所周知的策略来处理这种用例?
发布于 2015-11-12 23:42:01
幸运的是,这个问题已经为您解决了。
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 (包括安卓、Lua、Modula 3、OCAML、Octave、Scilab和R )。还支持几种解释和编译的方案实现(Guile、MzScheme/球拍、鸡)
https://stackoverflow.com/questions/33673959
复制相似问题