我想包装对象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])
问题在于,当
bar1
和bar2
被垃圾回收时,底层的C ++内存也将被删除,并且foo
中的方法会导致分段错误。我可以用以下方法解决它:bar1.thisown = 0
bar2.thisown = 0
但是我希望有一种在调用
thisown
的构造函数时自动设置Foo
标志的方法,最好是通过接口文件中的类型映射。 最佳答案
这是不可能的。从SWIG 3.0 documentation:
鉴于C ++内存管理的棘手特性,代理类不可能自动处理所有可能的内存管理问题。但是,代理确实提供了一种手动控制机制,该机制可用于(如有必要)解决一些更棘手的内存管理问题。
如今,使用原始指针进行操作似乎也令人怀疑。我建议使用std::vector<std::shared_ptr<Bar>>
或vector<Bar>
提供的Bar
有效复制构造函数。