在自定義轉換器中,我正在檢查序列項是否是某種類型。到目前爲止,我有這個代碼(簡體)使用boost :: python :: handle作爲臨時?
namespace bp=boost::python;
/* ... */
static void* convertible(PyObject* seq_ptr){
if(!PySequence_Check(seq_ptr)) return 0;
for(int i=0; i<PySequence_Size(seq_ptr); i++)
if(!bp::extract<double>(PySequence_GetItem(seq_ptr,i)).check()) return 0;
/* ... */
}
/* ... */
但這泄漏內存,因爲PySequence_GetItem is returning a new reference。所以要麼我可以在循環中做這樣的事情:
PyObject* it=PySequence_GetItem(seq_ptr,i);
bool ok(bp::extract<double>(it).check();
Py_DECREF(it); // will delete the object which had been newly created
if(!ok) return 0;
但這相當笨拙;我可以做一個獨立的功能,但我正在調用bp::handle
實現計數器;所以這樣的事情可以做:
if(!bp::extract<double>(bp::handle<>(PySequence_GetItem(seq_ptr,i))).check()) return 0;
但使用手柄作爲臨時工氣餒this page提到。爲什麼?在.check()
實際被調用之前,對象是否可以被銷燬?有沒有其他優雅的方式來寫這個?