Python 调用 C 插件后,需要手动释放内存吗?
考虑到一个部署的问题是,我不太清楚 py 和 so 交互的原理,如果调用 so 函数,so 开辟的内存空间还受到 py 解释器控制吗?当完成调用,返回结果时,它是否会像一个 py 函数一样回收整个命名空间内的内存?(所以我不需要手动回收容器的内存)
还是说我必须回收我创建的每个容器的内存,不回收就会引发泄露?
考虑到一个部署的问题是,我不太清楚 py 和 so 交互的原理,如果调用 so 函数,so 开辟的内存空间还受到 py 解释器控制吗?当完成调用,返回结果时,它是否会像一个 py 函数一样回收整个命名空间内的内存?(所以我不需要手动回收容器的内存)
还是说我必须回收我创建的每个容器的内存,不回收就会引发泄露?
> so 开辟的内存空间还受到 py 解释器控制吗
外部库分配的数据,一般是要调用外部库对应的释放函数来释放的,不受 Python 解析器控制。严格来说 Python 解析器都不关心这数据是什么。
> 所以我不需要手动回收容器的内存
是要的,除非你用 Python 类包装一下,然后在析构函数中释放。
如果你在 c 中创建 Python 对象,需要通过 Py_INCREF/Py_DECREF 这两个宏维护好引用计数,Python 虚拟机会根据引用计数决定什么时候释放内存。
那么什么时候需要调整引用计数呢?典型的场景包括:对象被添加到容器中,或者对象作为函数结果返回时等等。
如果引用计数维护不当,轻则内存泄露(该减没减),重则内存非法访问(该加没加)。
另外我向 vector 里加入的不是类似 double 这种原生数据结构,而是 struct,这种情况下是否是每一个项目都要逐个删除,而 clear()不能统一释放?
谢谢
第二个问题,调用 clear 会对每个元素调用析构函数,析构函数函数一般就是用来释放资源的,因此无需逐个删除。如果你的 struct 引用了其他内存资源,例如 new 了什么其他对象,则需要在析构函数中将它 delete 。