作者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
推 KSJ:非常感謝 第一個不檢查是因為能確定是number(讀字串再轉浮點) 05/23 19:05
→ KSJ:還是說 確定的話 連PyNumber_Float 都不用了 直接轉double? 05/23 19:06
推 KSJ:第一個例子最後 應該是de掉fxdata才是吧? 我筆誤了抱歉orz 05/23 19:11
→ KSJ:不過如果以筆誤執行 好像RC也會"剛好"消失 是嗎@_@?? 05/23 19:13
→ Tiberius:確定的話應該可以直接 PyFloat_AS_DOUBLE ... 05/24 20:02
→ Tiberius:對, 看錯了, 要 de 掉 fxdata, 不能刪 xdata O_O 05/24 20:03
→ Tiberius:刪 xdata 的話, 之後去看那個 seq 就有可能會爆 05/24 20:03