У меня есть следующий код Swig, который вызвал утечку памяти.
PyObject* FindBestMatch(const Bar& fp) {
Foo* ptr(new Foo());
float match;
// call a function to fill the foo pointer
return Py_BuildValue(
"(fO)",
match,
SWIG_NewPointerObj(ptr,
SWIGTYPE_p_Foo,
0 /* own */));
}
Я понял, что ptr не освобождается должным образом. Поэтому я сделал следующее:
PyObject* FindBestMatch(const Bar& fp) {
Foo* ptr(new Foo());
float match;
// call a function to fill the foo pointer
*PyObject *o = SWIG_NewPointerObj(ptr,
SWIGTYPE_p_Foo,
1 /* own */);* <------- 1 means pass the ownership to python
PyObject *result = Py_BuildValue("(fO)", match, o);
Py_XDECREF(o);
return result;
}
Но я не очень уверен, приведет ли это к повреждению памяти. Здесь Py_XDECREF (o) уменьшит количество ссылок, что может освободить память, используемую объектом «o». Но o является частью возвращаемого значения «результат». Полагаю, что освобождение "o" может привести к повреждению данных?
Я попробовал свои изменения. Он работает нормально, и вызывающая сторона (код Python) видит ожидаемые данные. Но это может быть потому, что никто не перезаписывает эту область памяти.
Так, как правильно обращаться с управлением памятью из приведенного выше кода? Я ищу документацию, но не вижу конкретного описания.
Пожалуйста, помогите!
Спасибо,
* 1015 синь *