我应该把 Py_INCREF 和 Py_DECREF 放在 Python C 扩展中这个块的哪里?

2024-05-11

每当我调用我的函数时,每次调用的内存使用量都会增加大约+10M,所以我认为这里存在一些内存泄漏。

....
PyObject *pair = PyTuple_New(2), *item = PyList_New(0);

PyTuple_SetItem(pair, 0, PyInt_FromLong(v[j]));

if(v[j] != DISTANCE_MAX && (p[j] || d[0][j])){
  jp=j;
  while(jp!=istart) {
    PyList_Append(item, PyInt_FromLong(jp));
    jp=p[jp];
  }

  PyList_Append(item, PyInt_FromLong(jp));

  PyList_Reverse(item);
}

PyTuple_SetItem(pair, 1, item);

return pair;
....

当我阅读时document http://docs.python.org/extending/extending.html#thin-ice,有些电话像

void
bug(PyObject *list)
{
    PyObject *item = PyList_GetItem(list, 0);

    PyList_SetItem(list, 1, PyInt_FromLong(0L));
    PyObject_Print(item, stdout, 0); /* BUG! */
}

需要像这样放置引用计数

void
no_bug(PyObject *list)
{
    PyObject *item = PyList_GetItem(list, 0);

    Py_INCREF(item);
    PyList_SetItem(list, 1, PyInt_FromLong(0L));
    PyObject_Print(item, stdout, 0);
    Py_DECREF(item);
}

那么,我应该将 Py_INCREF 和 Py_DECREF 放在我的函数中的哪里?


使用 PyInt_FromLong() 创建并添加到列表中的对象应保存在局部变量中。

原因是所有权规则 http://docs.python.org/extending/extending.html#ownership-rules: PyInt_FromLong() 生成您拥有的引用。在对 PyTuple_SetItem() 的调用中,您再次失去了此所有权,因为 PyTuple_SetItem() 从您那里“窃取”了它,因此您不必关心。但 PyList_Append() 不会这样做,它会增加引用计数。为了正确地对对象进行 GC,您必须通过 DECREF'ing 释放您的所有权。

因此,您可以执行以下操作,而不是 PyList_Append(item, PyInt_FromLong(jp)):

PyObject * jpo = PyInt_FromLong(jp);
// do some error checking here
PyList_Append(item, jpo);
Py_DECREF(jpo);

这将使程序做正确的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该把 Py_INCREF 和 Py_DECREF 放在 Python C 扩展中这个块的哪里? 的相关文章

随机推荐

  • iOS 中通过 USB 进行反向端口转发

    我在桌面上有一个 Web 套接字服务器 在 iPhone 设备上有一个客户端 我想使用 USB 而不是任何网络与他们通信 我已经使用 adb reverse 在 android 上实现了它 但无法找到适用于 iOS 的任何解决方案 我尝试使
  • 使用 CSS 将 Div 分成 2 列

    我一直在尝试使用 CSS 将 div 分成两列 但我还没有设法让它工作 我的基本结构如下 div div div div div div div div div div div div div div 如果我尝试将右侧和左侧 div 浮动到
  • 使用 d3 进行多级/分组轴标签

    我想知道是否有一种简单的方法可以在 d3 中添加多级 分层 分组轴标签 例如 如果我有一个折线图 其中 x 轴的月份名称跨越多年 那么我还希望将年份作为月份名称下方的标签 因此它看起来像这样 Oct Nov Dec Jan Feb Mar
  • 通过自定义文本更改库存文本中的 WooCommerce 产品可用性

    我想更改库存数量后面的 有库存 文字 我尝试在我的 WordPress php 编辑器中添加此 PHP 代码 但它不起作用 你知道为什么吗 谢谢 add filter woocommerce get availability text bb
  • 通过 id 从通用列表中删除对象

    我有一个像这样的域类 public class DomainClass public virtual string name get set public virtual IList
  • 有效,但未捕获引用错误:当我在控制台中键入数组时未定义数组

    我用 js 制作了一个 Tic Tac Toe 游戏 我有几个数组 一个用于 html td 元素 网格 用于查看它们之前是否被点击过 boolGrid 还有一个用颜色检查结束条件 colorgrid 我使用 var 关键字及其内容在全局范
  • UIToolbar setBackgroundColor 没有完全改变颜色

    我正在尝试设置 a 的背景颜色UIToolBar 我尝试从 IB 的属性检查器中选择颜色 并尝试通过编程方式设置它setBackgroundColor UIColor 两种解决方案都有效 但只是部分有效 颜色与白色混合了大约 50 并且工具
  • WPF MVVM 在窗口关闭时调用 ViewModel Save 方法

    我已经弄清楚如何从我的 ViewModel 关闭窗口 现在我需要从另一侧解决窗口关闭问题 当用户单击窗口的关闭按钮时 我需要在 ViewModel 中触发 Save 方法 我正在考虑将 Command 属性绑定到 Window 的关闭事件
  • *.default不是构造函数,带有导入的js插件

    我尝试创建一个简单的表单验证 并通过示例项目中的纱线链接注册它以测试设置 但这绝对行不通 我不知道如何继续 export default class Proofr constructor console log test 然后生成这个 脚本
  • 如果我只有 apk 文件,如何在 robotsium 中使用 R.id

    我想测试来自游戏市场的应用程序 当我尝试使用时遇到问题 solo clickOnView solo getView cn wps moffice eng R id writer edittoolbar saveBtn cn cn 无法解析为
  • ASP.NET 页面中的 WMV 文件

    如何在 ASP NET 网页中嵌入 WMV 文件 我希望它作为一个播放器可见 而不仅仅是一个链接 是否有 ASP NET 控件可以实现此目的 我在 VS 2008 工具栏上没有看到这个 在帮助中也找不到 我还没有准备好将此网站转移到 Sil
  • 如何将注销的用户重定向到 Java EE/JSF 中的主页? [复制]

    这个问题在这里已经有答案了 我需要只允许登录用户访问我的应用程序的大部分页面 我正在使用 JSF 2 开发 Java 企业应用程序 有谁知道我该怎么做 也许有一个配置文件 我在主页中有一个登录组件 我希望用户在单击页面上除少数项目之外的任何
  • 使用 SP 包中的 SpatialPoints() 转换坐标参考系 (CRS) 以创建空间数据框

    Issue 我有一个形状文件我已将其导入到 R 中 并为正在进行的分析选择了感兴趣的变量 我的最终目标是插值点数据 海豚 ID 获取海面温度 SST 堆栈中每个单独的光栅文件的值70 栅格来自名为 ncin SST 的对象 该对象是使用函数
  • 区分 Web 路由调用与 API 路由调用?

    In my web php文件中 我有一条如下所示的路线 Route get HomeController getFeed 而在我的api php文件中 我有一条如下所示的路线 Route get feeds HomeController
  • OpenCL 与 OpenMP 性能对比 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有研究比较 OpenCL 与 OpenMP 的性能 具体来说 我对使用 OpenCL 启动线程的开销成本感兴趣 例如 如果将域分解
  • Grails:如何查询多对多映射中的对象?

    您好 我有以下域类 class Student int age static hasMany courses Course class Course String name static hasMany students Student 我
  • 有没有一种方法可以非交互地压缩大量提交?

    我正在尝试压缩一系列提交 HEAD 到 HEAD 3 有没有一种快速的方法可以做到这一点 或者我需要使用 rebase interactive 确保你的工作树是干净的 然后 git reset soft HEAD 3 git commit
  • 如何在 iPhone 上使用 glib? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这几天我正在做一个项目 我的项目中包含了一个第三方库 该库是基于glib的 这真的让我抓狂 大家能告诉我我该怎么办吗 如何在 iPho
  • 用数字填充 asp.net 下拉列表

    一个简单的查询 我想用从 17 到 90 开始的数字填充下拉列表 最后一个数字应该是像 90 而不是 90 这样的字符串 我猜逻辑将使用 for 循环 如下所示 for int a 17 a lt 90 a ddlAge Items Add
  • 我应该把 Py_INCREF 和 Py_DECREF 放在 Python C 扩展中这个块的哪里?

    每当我调用我的函数时 每次调用的内存使用量都会增加大约 10M 所以我认为这里存在一些内存泄漏 PyObject pair PyTuple New 2 item PyList New 0 PyTuple SetItem pair 0 PyI