HTTP経由でテキストにアクセスしてダウンロードするpythonオブジェクトがあります。この python オブジェクトを実行し、c++ コードを使用してそのテキストを処理しています。いえ
/* CPPCode.cxx */
int main(...) {
for(int i = 0; i < numURLs; i++) {
// Python method returns a string
PyObject *pyValue = PyObject_CallMethod(pyObjectInstance, pyFunctionName, par1, par2....);
string valString = PyString_AsString(pHistValue);
// ... process string ...
}
}
/* PyObject.py */
class PyClass:
def PyFunction(...):
try: urlSock = urllib.urlopen(urlName)
except ...
while(...) :
dataStr = urlSock.readline()
# do some basic string processing....
return dataStr
ほとんどの URL は正常に動作します。C++ コードは適切な文字列を取得し、処理できます。すべて問題なく動作します。ブラウザー上で (基本的に) 他の URL と同じように見えるいくつかの特定の URL は、PyString_AsString() メソッドで segfault を引き起こします。
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000000000b2
0x000000010007716d in PyString_AsString ()
Python メソッド (上記の疑似コードの「dataStr」) によって返される文字列を出力すると、問題ないように見えます。何がこの問題を引き起こしているのかわかりません---続行する方法についてのヒントをいただければ幸いです! ありがとう
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解決:
私が使用していたテンプレートコードには呼び出しがありました
Py_DECREF(pyValue)
電話する前に
PyString_AsString(pyValue)
特定の関数呼び出しで割り当てが解除された理由はわかりません。「Gecco」が以下のコメントで述べているように、
PyString_AsString のドキュメントには次のように書かれています。「ポインタは、コピーではなく、文字列の内部バッファを参照します。文字列が PyString_FromStringAndSize(NULL, size) を使用して作成されたばかりでない限り、データを変更してはなりません。割り当てを解除してはなりません。 " '