2014-07-03 2 views
2

Я пишу свой собственный модуль 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 для таких случаев?

ответ

2

my_create_output должен обрабатывать освобождение всего, что он создает в случае исключения, поскольку вызывающий объект, улавливающий исключение, не имеет доступа к нему.

+0

Должен ли я использовать 'Py_XDECREF', чтобы позволить интерпретатору python удалять объекты? –

+0

@SamvelHovsepyan: Если ваш объект находится в состоянии, когда обычный деструктор очистит его правильно, тогда 'Py_XDECREF', что он внутри' my_create_output', вероятно, будет нужно сделать. – user2357112

+0

Я вижу, спасибо! –

Смежные вопросы