You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pybind11自动类型转换的内存管理问题咨询

Pybind11自动转换Python str到char*的内存管理问题

我正在使用Pybind11开发Python C++扩展模块,代码如下:

#include <pybind11/pybind11.h>
#include <string.h>
namespace py = pybind11;

int getLength(char* arg) {
   return strlen(arg);
}

PYBIND11_MODULE(example, m) {
    m.def("getLength", &getLength, "Get length using strlen", py::arg("arg"));
}

根据类型转换文档,调用getLength时Pybind11会将Python的str类型转为C++的char*。我假设该char*的内存分配在堆上,想咨询:

  • Pybind11会在函数返回时自动释放该内存吗?我是否需要在函数末尾添加delete[] arg;?
  • 另外我知道若函数接收py::str并手动转为char*,需自行负责内存分配与释放,那这种自动转换的情况是否也是如此?Pybind11是否会处理自动转换结果的内存管理,还是需要我手动处理?

回答

  • 不需要手动调用delete[] arg;,Pybind11会自动负责这块内存的释放。
  • 这种自动转换的场景和手动处理py::str转char*的情况完全不同:
    • 当你声明函数参数为char*时,Pybind11内部会自动完成Python字符串到C风格字符串的转换,转换后的内存由Pybind11的类型转换机制管理,函数返回后会自动释放,不需要你手动干预。
    • 而如果是你自己接收py::str对象,再手动转换获取char*——比如调用c_str()或者手动分配内存拷贝字符串——这时候才需要自行处理内存:c_str()返回的指针依赖py::str对象的生命周期,只要对象存活就有效;如果是手动堆分配的内存,就必须自己调用delete[]释放。

内容的提问来源于stack exchange,提问作者mbs9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:00:49