内存泄漏与swig包装std :: ios_base ::失败进入python

时间:2013-06-15 15:58:10

标签: c++ python exception swig

我正在使用SWIG将C ++库包装到Java和Python中。 Java端工作正常,但是我遇到了将代码包装到Python中的问题,特别是当抛出IO异常时,我在python中得到以下内容:

...
RuntimeError: _408aad4bde7f0000_p_std__ios_base__failure
swig/python detected a memory leak of type 'std::ios_base::failure *', no destructor found.

以下是我的.i文件中的相关位置:

%include "exception.i"
#include <stdexcept>
#include <ios>
#include <iostream>
%exception {
    try {
        $action
    } catch (const std::exception &e) {
        PyErr_SetString(PyExc_Exception, const_cast<char*>(e.what()));
    }
    catch(std::ios_base::failure &e) {
        PyErr_SetString(PyExc_IOError, const_cast<char*>(e.what()));
    }
}

有什么想法吗?对于它的价值,io异常在使用库的本机C ++和SWIG包装的Java中都按预期工作。

1 个答案:

答案 0 :(得分:0)

答案可能太晚了,但是你应该把这样的例外包裹起来

// http://www.swig.org/Doc1.3/Library.html#Library_stl_exceptions
%exception {
  try {
    $action
  } catch (const std::exception& e) {
    SWIG_exception(SWIG_RuntimeError, e.what());
  }
}

它也可以跨语言移植,并且您不需要为Java和Python单独进行异常处理。