2011-02-04 30 views
0

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であるので、ここで何が問題になっていますか?

+0

Py_DECREFはタプルを解放しますが、その時点のセグメンテーションフォルトは、以前のコードですでにメモリが壊れている可能性が高いと考えられます。あなたのコードのどこかを見てください。問題を示す完全な実行可能なサンプルを投稿することができれば(おそらくわかりにくいかもしれません)。 – Duncan

+0

いいえ、それは文字どおりプログラム全体です。しかし、周辺の '#include'ステートメントと' main'関数を追加しました。 – Channel72

+0

最初に:最初にPy_Initialize();を追加してみてください。 –

答えて

2

メインの冒頭でPy_Initialize();に電話をかけてもう一度お試しください。

+0

あなたはそうですが、タプルや長いタイプの初期化はほとんど間違いありませんので、破壊されていません。 – ncoghlan

関連する問題