我已经将一个C ++程序编译成一个动态库,我现在通过ctypes在python中调用它。但是,我收到以下错误:
*** glibc detected *** ../../bin/python: free(): invalid pointer: 0x00007fbdf8ae3500 ***
如何确定这是C ++代码中的错误,还是我如何使用ctypes?
C ++库在与C程序链接时运行成功,或者我将其编译为独立程序。当与ctypes结合使用时,它总是在这个C ++行崩溃:
// ... A bunch of code
if(tempBuffer) {
delete[] tempBuffer;
// More code below that never runs...
失败的Python代码:
def test(fileName):
feedbackLib = cdll.LoadLibrary("./libpitch.so")
# Set return type to a character pointer
feedbackLib.getPitchString.restype = c_char_p
feedbackLib.getPitchString.argtypes = [c_char_p]
# Crashes Here!
feedbackStr = feedbackLib.getPitchString(fileName)
return feedbackStr
出于某种原因,如果我像这样改变一切,我可以让python程序成功运行:
def test(fileName):
# I've only changed this line
feedbackLib = CDLL("./libpitch.so")
# Set return type to a character pointer
feedbackLib.getPitchString.restype = c_char_p
feedbackLib.getPitchString.argtypes = [c_char_p]
# No longer crashes!
feedbackStr = feedbackLib.getPitchString(fileName)
return feedbackStr
但是,如果我开始向上面的函数添加内容(我需要这样做),它会给我其他的glibc错误。
以下是有关我如何编译C ++的信息,以防它相关。
我正在调用的函数头,使用extern“C”似乎是如何让C ++代码与CTypes一起工作:
extern "C" char* getPitchString(char* filename);
g ++命令:
$(CXX) $(LDFLAGS) -fPIC -c $(SRCS) $(LIBS)
$(CXX) -shared -Wl,-soname,libpitch.so -o libpitch.so $(OBJS) $(LIBS)
答案 0 :(得分:2)
原来,代码的C ++部分出错了。我设法将这部分独立于Python / CType的segfault,并在调试后似乎工作。