Python C-APIを使用してPyTuple
オブジェクトを解放する適切な方法は何ですか?PyTupleオブジェクトの解放
私はそれがPyTuple_SetItem
「盗み」挿入された要素を参照するため、参照カウントセマンティクスに来るときタプルはやや特殊なであることを知っています。また、タプルオブジェクトの参照を減らすと、タプル内のすべての要素の参照カウントが減少することもわかります。これを考慮して
、私はそれを言うことは安全であるべきだと思うでしょう:
#include <Python.h>
#include <stdio.h>
int main()
{
PyObject* tup = PyTuple_New(1);
PyTuple_SetItem(tup, 0, PyLong_FromLong(100L));
printf("Ref Count: %d\n", tup->ob_refcnt);
Py_DECREF(tup);
}
をしかし、私はタプル参照カウントをデクリメントするとき、最後の行は、セグメンテーションフォールトが発生します。なぜこのようなことが起こるのか分かりません。 Py_DECREF
への呼び出しの直前に参照カウントが1
であるので、ここで何が問題になっていますか?
Py_DECREFはタプルを解放しますが、その時点のセグメンテーションフォルトは、以前のコードですでにメモリが壊れている可能性が高いと考えられます。あなたのコードのどこかを見てください。問題を示す完全な実行可能なサンプルを投稿することができれば(おそらくわかりにくいかもしれません)。 – Duncan
いいえ、それは文字どおりプログラム全体です。しかし、周辺の '#include'ステートメントと' main'関数を追加しました。 – Channel72
最初に:最初にPy_Initialize();を追加してみてください。 –