2016-09-16 12 views
1

私はC++開発者ではないので、私は自分が何をしているのか本当に分かっていません。残念ながら、私は次のコードをデバッグする必要がありますが、私は進歩していません。PyArg_ParseTupleを使用したC++とPython 3のメモリリーク

clsname, data = pyorient_native.deserialize(content, 
           content.__sizeof__(), self.props) 

このコードは、厄介なメモリリークを作成します。ここでは

static PyObject* native_deserialize(PyObject *self, PyObject *args){ 
    PyObject * pycontent; 
    int len; 
    PyObject * props = NULL; 
    PyArg_ParseTuple(args, "|SiO", &pycontent, &len, &props); 

    RecordParser reader("onet_ser_v0"); 
    TrackerListener* listener; 

    listener = new TrackerListener(props); 
    #if PY_MAJOR_VERSION >= 3 
     reader.parse((unsigned char*)PyBytes_AsString(pycontent), len, *listener); 
    #else 
     reader.parse((unsigned char*)PyString_AsString(pycontent), len, *listener); 
    #endif 
    return listener->obj; 
} 

は、そのコードを呼び出すのpythonです。実際、このコードを実行すると、20分以内に私の記憶が消滅します。

私はコードを見ましたが、C++で問題を見つけることはできません。

不正なC++コードがPythonコードを強制終了しないようにするにはどうすればよいですか? C++がメモリリークを作成したかどうかにかかわらず、Python内からC++コードをリサイクルするフラグを立てる方法はありますか?

メモリをC++でガベージコレクションする方法がありますか?どうすればPythonを実行してC++で正確なリークを見つけることができますか?

私の最大の問題は、Py_XDECREFとPy_XINCREFと残りの参照カウントマクロを理解することです。私はドキュメントを読んでいるが、明らかに私はどこで、いつこれらのものを使うのか分からないので、いくつかの文脈が欠落している。私はC + +開発者のための尊敬の負荷があります。彼らの仕事は不必要に難しいように思えます:(

+1

'native_deserialize()'はひどく設計されています。少なくとも、関数から 'listener'を渡し、' listener-> obj'を使った後に削除する必要があります。 PyObjectオブジェクトへのPyObjectポインタの戻り値を変更することができれば、はるかに良いでしょう。 – Deqing

+0

私はあなたに同意します。あなたが言ったことをするためにコードを変更しようとしましたが、リスナーを削除すると直ちにコードが壊れます。私は、objをクローンし、代わりにクローンを返してみましたが、失敗しました。私はC++のノブです:( – anber

答えて

0

それは、作成されたオブジェクトの参照カウントをPy_XDECREFにしていることが判明しました。私には。

私はこれらのマクロの落とし穴のいくつかを指摘し、このページを発見。

https://wingware.com/psupport/python-manual/2.3/ext/node22.html

ありドキュメントがあるが、それは非常に有用ではなかった。

https://docs.python.org/3/c-api/refcounting.html

多分誰かが、C++以外の人たちのために使いやすいものを共有することができますか?

+0

あなたは答える代わりに、より多くの質問をしたいのであれば質問を更新するべきです – px06

関連する問題