私は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 + +開発者のための尊敬の負荷があります。彼らの仕事は不必要に難しいように思えます:(
'native_deserialize()'はひどく設計されています。少なくとも、関数から 'listener'を渡し、' listener-> obj'を使った後に削除する必要があります。 PyObjectオブジェクトへのPyObjectポインタの戻り値を変更することができれば、はるかに良いでしょう。 – Deqing
私はあなたに同意します。あなたが言ったことをするためにコードを変更しようとしましたが、リスナーを削除すると直ちにコードが壊れます。私は、objをクローンし、代わりにクローンを返してみましたが、失敗しました。私はC++のノブです:( – anber