首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用另一种语言包装C++对象的策略--内存管理

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

Stack Overflow用户
提问于 2015-11-12 22:38:23
回答 1查看 86关注 0票数 3

我有一个C++库,我希望所有的核心逻辑都发生在这个库中。我想为它创建不同语言的包装器(例如。Objective C和Java),这将是向开发人员公开的唯一接口。

我面临的问题是包装器对象的内存管理。

考虑C++对象:

代码语言:javascript
运行
复制
class Node {
public:
  std::vector<std::shared_ptr<Node>> children;
  void addChild(std::shared_ptr<Node> node);
}

让我们假设我有一个Java object JNode,它盲目地包装Node,传递所有内容。

代码语言:javascript
运行
复制
public void doSomething() {
  JNode node = new JNode();
  someOtherNode.addChild(node);
}

当此方法返回时,Java对象将被销毁,但std::shared_ptr将使C++对象保持活动状态。

现在,稍后,假设我想遍历某个节点的子节点。它们对应的Java对象已经丢失,所以我需要在每次访问时重新创建它们。如果开发人员保留了对原始Java对象的引用,这看起来代价很高,而且可能会让人感到困惑,现在这些对象将有所不同。

我曾尝试过缓存Java对象的想法,但由于Java端可能会创建新的节点,而这些节点没有相应的C++对象,这一点变得更加复杂。这也使得内存管理变得困难,因为Java端可能会删除节点,这样就没有剩余的引用,但C++缓存会让它们保持活动状态。

有没有更好的/众所周知的策略来处理这种用例?

EN

回答 1

Stack Overflow用户

发布于 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/球拍、鸡)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33673959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档