Python C Api和正确处理c++类中的内存
Python C Api and correct handling of memory in C++ classes
我想知道如何处理以下问题。在我的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,然后再重新分配吗?有人建议另一种方法吗?
我不清楚你为什么在Python中使用字典,当您使用一组连续的整数进行索引时,从0开始。然而,在使用它之前,你必须做一个PyDict_New
来创建字典。接着,当你重新同步时,你在开始使用前应该清除字典吗PyDict_Clear
,而不是重新分配一个新的…没有其他的应该是必要的。(如果你重新分配一个新的,就像你在在你的代码中,你应该减少旧的引用计数一分之一。但是Python端引用的任何代码旧的继续指旧的;PyDict_Clear
是这可能是更好的解决方案。
另外,您应该注意临时Python对象有关。目前,不需要别的了,因为在循环中只使用Python(因此,C)函数,并且它们不能触发c++异常。无论如何都要更改代码稍微有点,但情况可能不再是这样。一般来说,我发现你应该把PyObject*
包装在一个类中析构函数调用Py_DecRef
,而不是显式地调用它,并且可能由于异常而错过呼叫。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存