作者Tiberius (渴望平凡的幸福)
看板Python
标题Re: [心得] 结合Python 与 C(C++) 的优点
时间Fri May 22 17:57:28 2009
※ 引述《KSJ (阿真)》之铭言:
: 1.很正规的写法
: 把py_XYTZseq中第i个 py_数值(xdata)
: 转成 py_float(fxdata)
: 再转成c_double 存入 Xseq[j]
: 然後再把有new reference(新)的pyobject都decref掉
: PyObject *xdata = PySequence_Fast_GET_ITEM(XYTZseq, i); //借
: PyObject *fxdata = PyNumber_Float(xdata); //新
: Xseq[j] = PyFloat_AS_DOUBLE(fxdata); //无
: Py_DECREF(xdata);
这样子很 ok
但是想用 PyNumber_Float() 多做一次转换的话,
应该也会想检查转出来的东西有没有变 NULL 才对 ...
: 2.做的事都一样
: PyObject *xdata = PySequence_Fast_GET_ITEM(XYTZseq, i); //借
: xdata = PyNumber_Float(xdata); //新
: //^^^^^^此处xdata 指向原来的自己
: //不知道会不会出什麽问题
: Xseq[j] = PyFloat_AS_DOUBLE(xdata);
: Py_DECREF(xdata);
这个版本也 ok, 反正 xdata 本来就是 borrowed reference, 不必特别打理
: 3.把所有的东西写成一行
: Xseq[j] = //(bbs不够宽换行一下)
: PyFloat_AS_DOUBLE(PyNumber_Float(PySequence_Fast_GET_ITEM(XYTZseq, i)))
: 里面都没有指定"间接"的py_object去接中途所算的值
: 那这样并没有任何"东西"reference+1吗??
这样不行, PyNumber_Float 生出来的新物件没释放掉
有可能变成 memory leak
(我不确定会不会被 garbage collector 抓到, 最好不要冒险)
总之 PyNumber_Float() 会生一个新物件出来, 用完必须自己打理掉
最好检查一下 NULL, 考虑要不要改用 Py_XDECREF ...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.120.15.14
1F:推 KSJ:非常感谢 第一个不检查是因为能确定是number(读字串再转浮点) 05/23 19:05
2F:→ KSJ:还是说 确定的话 连PyNumber_Float 都不用了 直接转double? 05/23 19:06
3F:推 KSJ:第一个例子最後 应该是de掉fxdata才是吧? 我笔误了抱歉orz 05/23 19:11
4F:→ KSJ:不过如果以笔误执行 好像RC也会"刚好"消失 是吗@_@?? 05/23 19:13
5F:→ Tiberius:确定的话应该可以直接 PyFloat_AS_DOUBLE ... 05/24 20:02
6F:→ Tiberius:对, 看错了, 要 de 掉 fxdata, 不能删 xdata O_O 05/24 20:03
7F:→ Tiberius:删 xdata 的话, 之後去看那个 seq 就有可能会爆 05/24 20:03