У меня есть объект python, который обращается и загружает некоторый текст через HTTP. Я запускаю этот объект python и обрабатываю этот текст, используя код C++. I.e.Sporadic segfault в C++ расширение python
/* 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
Большинство ссылок отлично работает --- C++ код получает правильную строку, я могу обрабатывать его, все счастливы и здоровы. Несколько конкретных URL, которые выглядят (в основном) так же, как другие на браузер, приводят к Segfault в методе PyString_AsString():
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000000000b2
0x000000010007716d in PyString_AsString()
Если я распечатать строку, которая должна быть возвращена методом питона ('dataStr' в псевдокоде выше), это выглядит отлично! Я понятия не имею, что может вызвать эту проблему --- любые советы о том, как обрабатывать, будут оценены! Thanks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~
РЕШЕНИЕ:
код шаблона я использовал был вызов
Py_DECREF(pyValue)
, прежде чем я назвал
PyString_AsString(pyValue)
Почему это было быть высвобождены наверняка участн я не знаю. Как говорит Gecco в комментариях ниже,
Документация PyString_AsString гласит: «Указатель ссылается на внутренний буфер строки, а не на копию. Данные не должны быть изменены каким-либо образом, если только строка не была создана используя PyString_FromStringAndSize (NULL, размер). Он не должен быть освобожден ». '
И что это за таинственный URL? –
http://www.wunderground.com/history/airport/PAFM/2012/01/05/DailyHistory.html?HideSpecis=0&format=1 – DilithiumMatrix
Необъяснимое segfault: Это довольно часто связано с некоторыми ошибками выделения памяти. Проверьте код _entire_, чтобы обеспечить правильное распределение и бесплатную использованную память ... – gecco