我有一个非常复杂的类,我试图在SWIG中创建Python包装器.但是,当我在Python中创建项目的实例时,我无法在没有收到消息的情况下初始化某些数据成员:
>>> myVar = myModule.myDataType()
swig/python detected a memory leak of type 'MyDataType *', no destructor found.
Run Code Online (Sandbox Code Playgroud)
有谁知道我需要做些什么来解决这个问题?有没有我可以用来生成析构函数的标志?
我知道持有指针会产生额外的解除引用操作的开销,但它会省去包括(可能很大的)包含我的struct定义的头文件.
但是,我的偏好取决于拥有std::vector<myStruct> *ptr2Vect会员的优势.即,不必在每个元素上调用delete.这有多大的性能优势?矢量真的可以在堆栈上分配对象吗?我对模板类相当新,并想知道动态数组是否有可能在堆栈上以及以什么价格进行扩展?
_ 编辑 _
我无法理解默认的复制构造函数和operator =成员,并试图将事物保持为简单的结构.我没有明确定义实现,因此担心将vector元素设置为对象而不是指针将在赋值时创建临时对象,这将被破坏并因此破坏其副本.
_ 编辑 _
很抱歉延迟提供相关信息(我对代码很害羞).
我想调用push_back(newObj).现在,如果我不使用指针,我有一个很大的问题,因为我不想执行深度复制,但我的dtor将释放LHS和RHS共享的复制构造函数调用的内存.
我正在努力std::vector<std::size_t>与SWIG合作.我需要为c ++库提供一个python接口.std::vector原始类型和对象的工作正常,但有一个问题std::size_t.
我在这里提供了一个关于github的MCVE .
基本上问题是std::size_t不被认可并被std::vector<std::size_t>视为std::vector< int,std::allocator< int > > *.当我尝试指定模板时,我得到以下内容.
使用%template(VecSize) std::vector<std::size_t>;给出:
swig -c++ -python c_swig_vec_std_size.i
:0: Warning(490): Fragment 'SWIG_AsVal_std_size_t' not found.
:0: Warning(490): Fragment 'SWIG_From_std_size_t' not found.
g++ -fpic -c c_swig_vec_std_size_wrap.cxx -I/public/users/paul/dev/software/Python-2.7.11/Include -I/public/users/paul/dev/software/Python-2.7.11
c_swig_vec_std_size_wrap.cxx: In static member function ‘static int swig::traits_asval<long unsigned int>::asval(PyObject*, swig::traits_asval::value_type*)’:
c_swig_vec_std_size_wrap.cxx:4289: error: ‘SWIG_AsVal_std_size_t’ was not declared in this scope
c_swig_vec_std_size_wrap.cxx: In static member function ‘static PyObject* swig::traits_from<long unsigned …Run Code Online (Sandbox Code Playgroud) 我需要在swig模板类中添加一个新方法,例如:
我在myswig.i中声明了一个模板类,如下所示:
%template(DoubleVector) vector<double>;
Run Code Online (Sandbox Code Playgroud)
这将在生成的.py文件中生成一个名为"DoubleVector"的类,其中包含一些生成的方法.假设它们是func1(),func2()和func3().这些是生成的函数,我无法控制它们.现在,如果我想向这个类(DoubleVector)添加一个名为"func4()"的新方法,我该怎么办呢?可能吗?
我知道一个名为%pythoncode的标识符,但我不能用它来定义这个模板类中的新函数.