のみこれは約PyModule_Create
言う:PyModule_Createによって返された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
の正しい使用法と所有権の意味は何ですか?
大丈夫です。ですから、モジュール読み込みエラー*を通知する必要があるが、 'PyModule_Create'が既に成功した場合、' Py_DECREF(m) 'は必要ですか? – greatwolf
@greatwolf:はい。 – user2357112