【发布时间】:2013-01-07 13:34:40
【问题描述】:
我想知道如何处理以下问题。在我的 C++ 类中,我有一个辅助 PyObject 指针。
class Foo
{
public:
// Should I new the dictionary here in constructor?
Foo()
{
}
// Must decrease the reference count or explicitly delete the dictionary?
~Foo()
{
Py_DECREF(myDictionary);
}
void sync()
{
myDictionary = PyDict_New();
for (int i=0; i<myInternalData.size(); i++)
{
PyObject *key = PyInt_FromLong(i);
PyObject *val = PyInt_FromLong(myInternalData.at(i));
PyDict_SetItem(dict,key,val);
Py_DecRef(key);
Py_DecRef(val);
}
}
private:
PyObject *myDictionary;
std::vector<int> myInternalData;
}
在我的 C++ 代码中,myInternalData 结构偶尔会更新或调整大小,我想知道如何处理我的 python 字典的正确内存分配。
我不知道如何释放与其关联的内存,或者如何正确地使其与我的内部 std::vector 保持同步,而不会破坏堆或引发内存泄漏。
对 Python C API 有帮助吗?我应该用PyObject_Del 释放PyDict,然后再次重新分配它吗?有人建议另一种方法?
【问题讨论】:
-
你经常打电话给
sync吗?据我所知,这可能是内存泄漏的来源,因为您正在分配新对象。另外(我在这里可能错了),我认为解除分配字典的适当方法可能是将 ref 计数器减少到零(docs.python.org/2/c-api/refcounting.html)。您是否尝试使用 valgrind 来查看您在哪里得到了内存泄漏?
标签: c++ python memory-leaks python-c-api reference-counting