C++ c+中的偶发断层+;python扩展

C++ c+中的偶发断层+;python扩展,c++,python,segmentation-fault,exc-bad-access,python-extensions,C++,Python,Segmentation Fault,Exc Bad Access,Python Extensions,我有一个python对象,它通过HTTP访问和下载一些文本。 我运行这个Python对象,并使用C++代码处理该文本。 即 如果我打印出python方法应该返回的字符串(“上面的伪代码中的dataStr”),它看起来很好!我不知道是什么原因导致了这个问题——任何关于如何处理的提示都将不胜感激! 谢谢 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 解决方案: 我使用的模板代码调用了 Py_DECREF(pyValue) 在我打电话之前 Py

我有一个python对象,它通过HTTP访问和下载一些文本。 我运行这个Python对象,并使用C++代码处理该文本。 即

如果我打印出python方法应该返回的字符串(“上面的伪代码中的dataStr”),它看起来很好!我不知道是什么原因导致了这个问题——任何关于如何处理的提示都将不胜感激! 谢谢

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解决方案:

我使用的模板代码调用了

Py_DECREF(pyValue)
在我打电话之前

PyString_AsString(pyValue)
我不知道为什么它会被释放用于某些特定的函数调用。正如“Gecco”在下面的评论中所说


“PyString\u AsString文档中说:”指针指向字符串的内部缓冲区,而不是副本。除非字符串是使用PyString\u FromStringAndSize(NULL,size)创建的,否则不得以任何方式修改数据。如果您使用-g调试标志编译C代码(至少在GCC中),则不得释放该字符串。“

”然后可以使用gnu调试器gdb运行python代码:

$ gdb /path/to/python/compiled/against 
... blah ...
(gdb) run PyObject.py

您应该捕获您的segfault。

PyString\u AsString
文档中说:“指针指向字符串的内部缓冲区,而不是副本。除非字符串是使用PyString\u FromStringAndSize(NULL,size)创建的,否则不能以任何方式修改数据。它不能被释放。


请确保您没有释放此缓冲区

我猜Py_DECREF以某种方式获得了一个空值。

这个神秘的URL是什么?无法解释的segfault:这通常是由于一些内存分配错误造成的。检查整个代码以确保正确分配和释放使用过的内存…
PyString\u AsString
文档说明:“指针指向字符串的内部缓冲区,而不是副本。不得以任何方式修改数据,除非该字符串是使用PyString\u FromStringAndSize(NULL,size)创建的。不得释放。”请确保您没有释放此缓冲区。@gecco这是我的第一个想法,但我没有使用任何动态分配的内存;而且因为每次都会发生相同URL的错误,无论我在之前或之后检查了多少次,似乎还有另一个问题。我没有手动分配或取消分配任何内存。这是我从GDB
code
程序接收到的信号EXC\u BAD\u ACCESS的完整回溯,无法访问内存。原因:13地址:0x0000000000000x00007FFF80237C00在strlen()中(gdb)bt#0 0x00007fff80237c00在strlen()中#1 0x0000000100088e1e在PyString中(格式为v()#2 0x00000001000d3fdc在PyErr格式中#3 0x000000010008510a在PyString中)在PyString中#4 0000000100085183在PyString中#stl#u vector.h:137的callPythonWHistoryMethod()中的#5 0x000000010000f6f3,stl#u vector.h:137的main()中的#6 0x0000000100010555,因此现在您可以生成代码,查看是什么破坏了一切-例如,什么是“pHistValue”:try“(gdb)print pHistValue”看看它是否是你所期望的。我的理解是,一旦对一个对象的引用为零,它就会被释放(比如在cocoa中)。是的,当它达到零时,它就会被释放。接得好,我会修好的。
PyString_AsString(pyValue)
$ gdb /path/to/python/compiled/against 
... blah ...
(gdb) run PyObject.py