Я пишу свой собственный модуль Python и нуждаюсь в советах. Давайте рассмотрим пример функции в модуле:Каково правильное управление памятью python в случае исключений?
PyObject* my_func(PyObject *self, PyObject* args)
{
PyObject* returnObj;
try
{
returnObj = my_create_output();
}
catch(const std::exception& ex)
{
PyErr_SetString(PyExc_Exception, ex.what());
returnObj = NULL;
}
return returnObj;
}
my_create_output
функция может поднимать различные исключения (также мои собственные исключения). returnObj
- это большая структура (например, список), и может случиться так, что функция my_create_output
вызовет исключение, когда половина результата уже создана. Как удалить выделенные объекты в блоке catch
для таких случаев?
Должен ли я использовать 'Py_XDECREF', чтобы позволить интерпретатору python удалять объекты? –
@SamvelHovsepyan: Если ваш объект находится в состоянии, когда обычный деструктор очистит его правильно, тогда 'Py_XDECREF', что он внутри' my_create_output', вероятно, будет нужно сделать. – user2357112
Я вижу, спасибо! –