Python C API和C++类中内存的正确处理

2024-06-16 11:51:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何处理以下问题。在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,然后再重新分配吗?有人建议另一种方法吗?在


Tags: thekey内存pydictionaryfoovalint
1条回答
网友
1楼 · 发布于 2024-06-16 11:51:11

我不明白你为什么要用Python的字典, 当使用一组连续的整数建立索引时,从0开始。 但是:在使用它之前,您必须对 创建字典。之后,当您重新同步时,您 开始使用前应清除词典 PyDict_Clear,而不是重新分配一个新的。。没别的了 应该是必要的。(如果您重新分配一个新的,就像您在 你的代码,你应该减少旧的引用计数 第一个。但是Python端的任何代码引用 旧的将继续引用旧的;PyDict_Clear是 可能是更好的解决方案。)

另外,您应该注意临时Python对象的位置 参与其中。目前,没有其他必要,因为 在循环中只使用Python(因此,C)函数,并且 它们不能触发C++异常。更改代码 稍有一点,这种情况可能就不复存在了。一般来说, 我发现您应该将PyObject*包装在一个 析构函数调用Py_DecRef,而不是显式调用它, 可能是因为一个例外而错过了电话。在

相关问题 更多 >