Python C API调用Py_SetPath()后出现free()无效大小错误排查求助
解决Python C API中Py_SetPath触发free()无效错误的问题
嘿,我来帮你捋清楚这个问题!你遇到的free(): invalid size崩溃,核心原因非常明确——Py_SetPath必须在Python解释器初始化之前调用,也就是要把它放在Py_Initialize()的前面!
问题根源
Python的C API设计里,Py_SetPath是用来提前配置解释器模块搜索路径的接口,它需要在解释器还没完成任何内部内存分配和初始化工作时执行。一旦你先调用了Py_Initialize(),解释器已经创建了不少内部数据结构,这时候再调用Py_SetPath就会破坏已有的内存布局,触发内存释放时的非法操作,直接导致程序崩溃。
修正后的代码
把调用顺序调换过来,再加上必要的收尾操作,代码就能正常运行了:
#include <Python.h> int main() { printf("setting path\n"); // 先设置路径,再初始化解释器 Py_SetPath(L"/usr/lib/python3.6"); Py_Initialize(); printf("success\n"); // 清理解释器资源,避免内存泄漏 Py_Finalize(); return 0; }
额外注意事项
- 你的编译命令
gcc pytest.cpython3-config --libspython3-config --includes`是完全正确的,不用调整; Py_SetPath的参数需要是宽字符串(带L前缀),在你的Ubuntu环境下这个写法没问题;- 记得调用
Py_Finalize()来释放Python解释器占用的资源,养成良好的内存管理习惯。
按照这个写法运行,你就能看到success正常打印,也不会再出现内存错误啦!
内容的提问来源于stack exchange,提问作者cowemoji
相关产品推荐
相关产品推荐

