我想包装对象Foo的构造函数,该构造函数采用指向Bar的指针向量:

    Foo(std::vector<Bar*> const&); //!< Constructor


在我的界面文件中,我有:

%include "std_vector.i"
%template (vector_bar_p) std::vector<Bar*>;
%include "foo.h"


通过这种方式,我可以从Python中将Foo核心化为:

bar1, bar2 = Bar(), Bar()
foo = Foo([bar1,bar2])


问题在于,当bar1bar2被垃圾回收时,底层的C ++内存也将被删除,并且foo中的方法会导致分段错误。我可以用以下方法解决它:

bar1.thisown = 0
bar2.thisown = 0


但是我希望有一种在调用thisown的构造函数时自动设置Foo标志的方法,最好是通过接口文件中的类型映射。

最佳答案

这是不可能的。从SWIG 3.0 documentation


  鉴于C ++内存管理的棘手特性,代理类不可能自动处理所有可能的内存管理问题。但是,代理确实提供了一种手动控制机制,该机制可用于(如有必要)解决一些更棘手的内存管理问题。


如今,使用原始指针进行操作似乎也令人怀疑。我建议使用std::vector<std::shared_ptr<Bar>>vector<Bar>提供的Bar有效复制构造函数。

09-10 05:54
查看更多