boost::python 과 swig 를 놓고 고민하다가
swig 를 고르지 못한 이유는 메모릭 릭이 있다는 소문 때문이었습니다.
crtdbg 로 돌려보니 정말 메모리 릭이 있더군요 (-_-);
프로그램 실행도중 딱 한번만 할당 되는 부분이라
그다지 심각한 메모리릭은 아니지만 일단 찜찜해서 수정하는 코드를 만들어보았습니다.
SWIG_CLIENT_DATA_LEAK_CODE = """SWIGRUNTIME void
PySwigClientData_Del(PySwigClientData* data)
{
Py_XDECREF(data->newraw);
Py_XDECREF(data->newargs);
Py_XDECREF(data->destroy);
}"""
SWIG_CLIENT_DATA_SAFE_CODE = """SWIGRUNTIME void
PySwigClientData_Del(PySwigClientData* data)
{
Py_XDECREF(data->newraw);
Py_XDECREF(data->newargs);
Py_XDECREF(data->destroy);
free(data);
}"""
SWIG_GLOBALS_LEAK_CODE = """SWIGRUNTIME void
SWIG_Python_DestroyModule(void *vptr)
{
swig_module_info *swig_module = (swig_module_info *) vptr;
swig_type_info **types = swig_module->types;
size_t i;
for (i =0; i < swig_module->size; ++i) {
swig_type_info *ty = types[i];
if (ty->owndata) {
PySwigClientData *data = (PySwigClientData *) ty->clientdata;
if (data) PySwigClientData_Del(data);
}
}
Py_DECREF(SWIG_This());
}
"""
SWIG_GLOBALS_SAFE_CODE = """SWIGINTERN PyObject * SWIG_globals(void);
SWIGRUNTIME void
SWIG_Python_DestroyModule(void *vptr)
{
swig_module_info *swig_module = (swig_module_info *) vptr;
swig_type_info **types = swig_module->types;
size_t i;
for (i =0; i < swig_module->size; ++i) {
swig_type_info *ty = types[i];
if (ty->owndata) {
PySwigClientData *data = (PySwigClientData *) ty->clientdata;
if (data) PySwigClientData_Del(data);
}
}
Py_DECREF(SWIG_globals());
Py_DECREF(SWIG_This());
}
"""
def Fix(path):
print path
code = open(path).read()
code = code.replace(SWIG_CLIENT_DATA_LEAK_CODE, SWIG_CLIENT_DATA_SAFE_CODE)
code = code.replace(SWIG_GLOBALS_LEAK_CODE, SWIG_GLOBALS_SAFE_CODE)
open(path, "w").write(code)
if "__main__" == __name__:
import sys
if len(sys.argv) >= 2:
Fix(sys.argv[1])
swig.exe 실행후 나온 출력 파일을 인자로 코드를 수정해주는 스크립트입니다.


python 을 좋아하는 게임 프로그래머