2013-06-15 1 views
0

저는 SWIG를 사용하여 C++ 라이브러리를 Java와 Python으로 포장했습니다. 자바 쪽은 잘 작동하지만, IO 예외가 발생했을 때이 특히 파이썬에 코드를 포장하는 문제를, 데, 나는 파이썬에서 다음을 얻을 : 여기 swig wrapping으로 메모리 누수가 발생했습니다 :: ios_base :: python으로 인한 실패

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

내에서 관련 장소입니다. 파일 :

%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에서 예상대로 작동합니다.

+0

예제 인터페이스에 뭔가 빠져 있다고 생각합니다. 거기에 '% exception' 지시어를 사용하는 함수가 없습니다. 예제를 가능한 가장 작은 인터페이스 파일로 줄이고 경고를 생성하는 데 필요한 Python 코드로 줄일 수 있습니까? – Flexo

+0

그래, 나는 그들을 자르면 모든 것이 다소 길다. 나는 처음부터 간단한 테스트를 작성했다. C++ 코드가 std :: ios_base :: failure를 던지면 제대로 작동하는 것 같다. 그래서 나는 분명히 어딘가에 뭔가 잘못했다. –

답변

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()); 
    } 
} 

같은 예외를 포장하는 거 야 당신은 자바와 파이썬에 대한 처리를 별도의 예외가 필요하지 않습니다.

관련 문제