0

我正在应用嵌套类的 SWIG 手册部分中的解决方法,它使用全局内部类。在这里,我将向您展示类似于手册中的版本,但尽可能为您简化。我还必须添加内联定义{}method()因为没有 SWIG 将根本无法工作。

// File outer.h
class Outer {
public:
  class Inner {};
  void method() {}
};


// File : example.i

// Redefine nested class in global scope in order for SWIG to generate
// a proxy class. Only SWIG parses this definition.
class Inner {};

%{
#include "outer.h"
%}
%include "outer.h"

%{
// SWIG thinks that Inner is a global class, so we need to trick the C++
// compiler into understanding this so called global type.
typedef Outer::Inner Inner;
%}

这很好用。但是,假设我更改method()为创建并返回嵌套Inner()

Inner method() { return Inner(); }

现在,结果如我所料(在实际更复杂的示例中),所以这不是我的问题。我的问题是,这警告泄漏:重复应用

>>>Outer().method()

结果是

swig/python detected a memory leak of type 'Outer::Inner *', no destructor found.

我知道如何解决这种问题 - 向 SWIG 提供违规类的完整定义。Inner但是,已经提供了全局范围类的完整定义。事实上,嵌套类的定义也提供了,但我猜 SWIG 忽略了它并且警告继续。

所以嵌套类按预期为我工作,除了我收到内存泄漏警告。

怎么避免??

4

1 回答 1

1

在 SWIG 文档(6.27 Nested Classes)中,看起来有一个功能标志%nestedworkaround可以解决这个确切的问题:

%module x

class Inner {
};

%nestedworkaround Outer::Inner;

%inline %{
class Outer {
public:
  class Inner {};
  Inner method() { return Inner(); }
};
%}

%{
typedef Outer::Inner Inner;
%}

结果:

>>> import x
>>> x.Outer().method()
<x.Inner; proxy of <Swig Object of type 'Inner *' at 0x0000000002AE6880> >
>>> x.Outer().method()
<x.Inner; proxy of <Swig Object of type 'Inner *' at 0x0000000002AE69A0> >

如果没有该标志,我会收到处理 SWIG 界面的警告:

x.i(15) : Warning 325: Nested class not currently supported (Inner ignored)

结果是这样的:

>>> import x
>>> x.Outer().method()
<Swig Object of type 'Outer::Inner *' at 0x0000000002AA6880>
>>> x.Outer().method()
swig/python detected a memory leak of type 'Outer::Inner *', no destructor found.
<Swig Object of type 'Outer::Inner *' at 0x0000000002AA69A0>
于 2013-11-10T07:12:11.117 回答