你若向前 2022-03-24 12:59 采纳率: 100%
浏览 12
已采纳

Python调用C++动态库函数出现segfault

问题遇到的现象和发生背景

为了使用 Python 调用 C++ 中写好的函数,将 C++ 函数打包成动态库文件,之后在 Python 中调用,C++ 函数中接收的参数类型存在有 unsigned char* 类型,在 Python 传入时使用 c_ubyte * 3072 代替,同时 Python 还需要获取指针被修改后的值。仅测试此部分文件,可以看到 Python 中的数组成功被 C++ 中的函数修改,但是将此部分用到 多线程程序 中,会出现段错误。是类型传递错了么。
查看 多线程程序 出错的 core 文件,发现函数在 subtype_dealloc 处出错,应该是含有调用 C++ 函数的类的实例在回收空间时出了错。

我想要达到的结果

Python程序中能够顺利回收空间,不出现 segfault,有什么好的建议么?

  • 写回答

1条回答 默认 最新

  • 你若向前 2022-03-26 20:40
    关注

    在使用Python调用C++函数时,需要注意Python程序运行时使用的空间与C/C++程序使用的空间互相保持一定的独立性,就是说,没有重叠的部分,因为两种程序各自回收开辟、使用的空间。在我使用Ctypes,加载编译的动态库时,单个程序不会出现问题,但是在多线程程序中,可能就会出现问题。我这里遇到的就是这样,这个可能还与所使用的机器(操作系统、甚至编译器程序?有关),在Python程序类的实例(类中有调用动态库中的C函数)回收时,出现segfault的问题。后来还是没有找到问题的具体原因,只是推测C/C++程序不可以修改Python中的变量,因为使用和修改的原因,导致内存回收冲突。
    最终尝试使用为Python写C++扩展的方式,这个在Python文档中有教程,在学习和使用的过程中,也渐渐意识到自己使用ctypes导入动态库使用C/C++程序的问题所在。在调用时,C++扩展中使用的数据,是根据Python中的数据进行构造,可以理解为使用一个拷贝的数据。Python中需要得到的结果,也是根据C++程序得到的结果进行构造。如果传回的数据是对象类型,则还需要考虑引用计数的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月26日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题