我有一个 C++ 库,我希望所有核心逻辑都在其中发生。我想用不同的语言(例如 Objective C 和 Java)为它创建包装器,这将是唯一向开发人员公开的接口(interface)。
我面临的问题是包装器对象的内存管理。
考虑 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 保持 Activity 状态。
现在,假设我想遍历某个节点的子节点。它们对应的 Java 对象已经丢失,所以我需要在每次访问时重新创建它们。如果开发人员保留对原始 Java 对象的引用,而现在这些对象将有所不同,这似乎代价高昂并且可能会造成混淆。
我曾考虑过缓存 Java 对象的想法,但由于 C++ 端可能正在创建新节点,而这些节点没有相应的 Java 对象,这使情况变得更加复杂。这也使内存管理变得困难,因为 C++ 端可能会删除节点,这样就没有剩余的引用,但 Java 缓存会让它们保持 Activity 状态。
是否有更好/已知的策略来处理此类用例?
最佳答案
很高兴这已经为您解决了。
SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of target languages including common scripting languages such as Javascript, Perl, PHP, Python, Tcl and Ruby. The list of supported languages also includes non-scripting languages such as C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), D, Go language, Java including Android, Lua, Modula-3, OCAML, Octave, Scilab and R. Also several interpreted and compiled Scheme implementations (Guile, MzScheme/Racket, Chicken) are supported
关于java - 用另一种语言包装 C++ 对象的策略——内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33673959/