Я заметил один недостающий дефиф с первого взгляда:
pFunc = PyObject_GetAttrString(pModule, operation.c_str());
if (pFunc && PyCallable_Check(pFunc)) {
// ...
Py_XDECREF(pFunc);
}
Это приведет к утечке любого не вызываемого атрибута, соответствующего operation
.
Два переназначения pValue
... Я думаю, это нормально, потому что PyTuple_SetItem
украдет ссылку на каждое из исходных значений.
Для этой строки, о которой вы спрашивали:
value = GetPyObjectString(PyList_GetItem(pValue, 1));
PyList_GetItem
возвращает заимствованную ссылку, поэтому тот факт, что вы не расшифровали ее, является правильным.
Но я нигде не вижу декларации для value
или GetPyObjectString
, поэтому я понятия не имею, что делает эта часть. Может быть, это просто получение заимствованного буфера из PyUnicodeObject *
и копирование его в какой-либо строковый тип C ++ wstring
или UTF-32, или, возможно, утечка объекта Python или скопированного буфера, или возврат необработанного буфера C, который вы просто утечка здесь или ... кто знает?
Но я бы, конечно, не поверил, что какой-то парень в Интернете нашел их всех на быстром сканировании. Научитесь пользоваться отладчиком памяти.
Или: вы используете C ++. RAII - это почти весь смысл использования C ++ - другими словами, вместо использования необработанных значений PyObject *
, вы можете использовать умный указатель, который автоматически расшифровывает данные. Или, что еще лучше, используйте готовую библиотеку, например PyCXX .