2017-02-13 19 views
1

的只說這對PyModule_Create由PyModule_Create'borrowed'或'acquired'返回PyObject *嗎?

模塊初始化函數可以創建和直接返回模塊對象。這被稱爲「單相初始化」,並採用下面的兩個模塊創建功能之一:

PyObject* PyModule_Create(PyModuleDef *def)

  • 創建一個新的模塊對象,鑑於DEF定義。這與PyModule_Create2()的行爲相似,module_api_version設置爲PYTHON_API_VERSION
  • ...

之前,它是從初始化函數返回時,生成的模塊對象是使用像PyModule_AddObject()功能通常填充。

另外,PyModule_Create不在this question的列表中。這將表明正在遵循傳統行爲,即呼叫者有望'獲得'被返回的參考PyObject*

但還沒有從這個python3porting博客文章,它有下面的例子:

static PyObject * 
moduleinit(void) 
{ 
    MOD_DEF(m, "themodulename", 
      "This is the module docstring", 
    module_methods) 

    if (m == NULL) 
     return NULL; 

    if (PyModule_AddObject(m, "hookable", 
     (PyObject *)&hookabletype) < 0) 
     return NULL;       /* line A */ 

    return m; 
} 

將「A線」不漏此代碼路徑的參考?什麼是PyModule_Create的正確使用和所有權語義?

回答

4

該代碼片段根本無法正確管理引用計數。除了你發現的泄漏,它也忘記了Py_INCREF(&hookabletype),儘管PyModule_AddObject steals a reference to the value

像往常一樣,如果沒有特別說明,PyModule_Create會返回一個新的參考,而不是借來的參考。

+0

好的,這是有道理的。因此,如果您需要發信號通知模塊加載錯誤*但PyModule_Create已成功,則需要使用'Py_DECREF(m)'? – greatwolf

+0

@greatwolf:是的。 – user2357112