我想知道如何处理以下问题。在C++类中,我有一个辅助的PyObjor指针。在
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++代码中,^ {< CD1>}结构有时被更新或调整大小,我想知道如何处理我的Python字典的正确内存分配。在
我不知道如何释放与它相关联的内存,也不知道如何正确地使它与我的内部std::vector
保持同步,而不会损坏堆或引发内存泄漏。在
pythoncapi有什么帮助吗?我应该用PyObject_Del
释放PyDict,然后再重新分配吗?有人建议另一种方法吗?在
我不明白你为什么要用Python的字典, 当使用一组连续的整数建立索引时,从0开始。 但是:在使用它之前,您必须对 创建字典。之后,当您重新同步时,您 开始使用前应清除词典
PyDict_Clear
,而不是重新分配一个新的。。没别的了 应该是必要的。(如果您重新分配一个新的,就像您在 你的代码,你应该减少旧的引用计数 第一个。但是Python端的任何代码引用 旧的将继续引用旧的;PyDict_Clear
是 可能是更好的解决方案。)另外,您应该注意临时Python对象的位置 参与其中。目前,没有其他必要,因为 在循环中只使用Python(因此,C)函数,并且 它们不能触发C++异常。更改代码 稍有一点,这种情况可能就不复存在了。一般来说, 我发现您应该将
PyObject*
包装在一个 析构函数调用Py_DecRef
,而不是显式调用它, 可能是因为一个例外而错过了电话。在相关问题 更多 >
编程相关推荐