2017-02-13 18 views
1

のみこれは約PyModule_Create言う:PyModule_Createによって返されたPyObject *は、「借用された」か「獲得されましたか?

モジュールの初期化関数が直接モジュールオブジェクトを作成して返すことがあります。これは、「単相の初期化」と呼ばれ、次の二つのモジュール作成機能のいずれかを使用している:

PyObject* PyModule_Create(PyModuleDef *def)

  • 新しいモジュールオブジェクトを作成し、DEFで定義与えられます。これはPyModule_Create2()のように動作し、module_api_versionPYTHON_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

このコードスニペットは、単に参照カウントを正しく管理していません。あなたが見つけたリークを除いて、それはPyModule_AddObject steals a reference to the valueにもかかわらず、Py_INCREF(&hookabletype)に忘れてしまいます。

特に指定のない限り、PyModule_Createは、借用参照ではなく新しい参照を返します。

+0

大丈夫です。ですから、モジュール読み込みエラー*を通知する必要があるが、 'PyModule_Create'が既に成功した場合、' Py_DECREF(m) 'は必要ですか? – greatwolf

+0

@greatwolf:はい。 – user2357112

関連する問題