如何让boost.python调用函数来释放对象? 我有一个C++函数 Obj*NexObjor(const char * name)< /C>。它返回从专用池分配的新对象。该对象应该通过free_object(Obj*Obj)释放(而不是通过free()或delete)。我如何安排boost.python包装器,以便在python obj超出范围(调用gc)时调用free\u obj?我认为最方便的方法是确保boost.python类声明同时包装obj和boost::shared\u ptr

如何让boost.python调用函数来释放对象? 我有一个C++函数 Obj*NexObjor(const char * name)< /C>。它返回从专用池分配的新对象。该对象应该通过free_object(Obj*Obj)释放(而不是通过free()或delete)。我如何安排boost.python包装器,以便在python obj超出范围(调用gc)时调用free\u obj?我认为最方便的方法是确保boost.python类声明同时包装obj和boost::shared\u ptr,python,c++,boost,boost-python,Python,C++,Boost,Boost Python,然后,使用boost::python::make_constructor在构造时实例化对象。返回的boost::shared_ptr应该设置自己的析构函数(在您的情况下,free_object())。以下是此解决方案的示意图: static boost::shared_ptr<Obj> init_from_c_string(const char* name) { //set destructor upon shared pointer initialisation retur

然后,使用
boost::python::make_constructor
在构造时实例化对象。返回的
boost::shared_ptr
应该设置自己的析构函数(在您的情况下,
free_object()
)。以下是此解决方案的示意图:

static boost::shared_ptr<Obj> init_from_c_string(const char* name) {
  //set destructor upon shared pointer initialisation
  return boost::shared_ptr<Obj>(new_object(name), &free_object);
}

//at your module scope, declare "Obj" like this
using namespace boost::python;
class_<Obj, boost::shared_ptr<Obj>>("Obj", "Obj docstring", no_init)
    .def("__init__", make_constructor(&init_from_c_string, default_call_policies(), (arg("name"))), "Constructs a new object with a given name.")
    //other .def and similar
;
static boost::shared_ptr init_from_c_string(const char*name){
//在共享指针初始化时设置析构函数
返回boost::shared_ptr(新_对象(名称)和free_对象);
}
//在您的模块范围内,像这样声明“Obj”
使用名称空间boost::python;
类(“Obj”,“Obj文档字符串”,无初始化)
.def(“uu init_uu”),make_构造函数(&init_from_c_string,default_call_policies(),(arg(“name”),“使用给定名称构造新对象”。)
//其他.def和类似文件
;

我认为最方便的方法是确保Boost.Python类声明同时包装了
Obj
Boost::shared_ptr

然后,使用
boost::python::make_constructor
在构造时实例化对象。返回的
boost::shared_ptr
应该设置自己的析构函数(在您的情况下,
free_object()
)。以下是此解决方案的示意图:

static boost::shared_ptr<Obj> init_from_c_string(const char* name) {
  //set destructor upon shared pointer initialisation
  return boost::shared_ptr<Obj>(new_object(name), &free_object);
}

//at your module scope, declare "Obj" like this
using namespace boost::python;
class_<Obj, boost::shared_ptr<Obj>>("Obj", "Obj docstring", no_init)
    .def("__init__", make_constructor(&init_from_c_string, default_call_policies(), (arg("name"))), "Constructs a new object with a given name.")
    //other .def and similar
;
static boost::shared_ptr init_from_c_string(const char*name){
//在共享指针初始化时设置析构函数
返回boost::shared_ptr(新_对象(名称)和free_对象);
}
//在您的模块范围内,像这样声明“Obj”
使用名称空间boost::python;
类(“Obj”,“Obj文档字符串”,无初始化)
.def(“uu init_uu”),make_构造函数(&init_from_c_string,default_call_policies(),(arg(“name”),“使用给定名称构造新对象”。)
//其他.def和类似文件
;

我认为最方便的方法是确保Boost.Python类声明同时包装了
Obj
Boost::shared_ptr

然后,使用
boost::python::make_constructor
在构造时实例化对象。返回的
boost::shared_ptr
应该设置自己的析构函数(在您的情况下,
free_object()
)。以下是此解决方案的示意图:

static boost::shared_ptr<Obj> init_from_c_string(const char* name) {
  //set destructor upon shared pointer initialisation
  return boost::shared_ptr<Obj>(new_object(name), &free_object);
}

//at your module scope, declare "Obj" like this
using namespace boost::python;
class_<Obj, boost::shared_ptr<Obj>>("Obj", "Obj docstring", no_init)
    .def("__init__", make_constructor(&init_from_c_string, default_call_policies(), (arg("name"))), "Constructs a new object with a given name.")
    //other .def and similar
;
static boost::shared_ptr init_from_c_string(const char*name){
//在共享指针初始化时设置析构函数
返回boost::shared_ptr(新_对象(名称)和free_对象);
}
//在您的模块范围内,像这样声明“Obj”
使用名称空间boost::python;
类(“Obj”,“Obj文档字符串”,无初始化)
.def(“uu init_uu”),make_构造函数(&init_from_c_string,default_call_policies(),(arg(“name”),“使用给定名称构造新对象”。)
//其他.def和类似文件
;

我认为最方便的方法是确保Boost.Python类声明同时包装了
Obj
Boost::shared_ptr

然后,使用
boost::python::make_constructor
在构造时实例化对象。返回的
boost::shared_ptr
应该设置自己的析构函数(在您的情况下,
free_object()
)。以下是此解决方案的示意图:

static boost::shared_ptr<Obj> init_from_c_string(const char* name) {
  //set destructor upon shared pointer initialisation
  return boost::shared_ptr<Obj>(new_object(name), &free_object);
}

//at your module scope, declare "Obj" like this
using namespace boost::python;
class_<Obj, boost::shared_ptr<Obj>>("Obj", "Obj docstring", no_init)
    .def("__init__", make_constructor(&init_from_c_string, default_call_policies(), (arg("name"))), "Constructs a new object with a given name.")
    //other .def and similar
;
static boost::shared_ptr init_from_c_string(const char*name){
//在共享指针初始化时设置析构函数
返回boost::shared_ptr(新_对象(名称)和free_对象);
}
//在您的模块范围内,像这样声明“Obj”
使用名称空间boost::python;
类(“Obj”,“Obj文档字符串”,无初始化)
.def(“uu init_uu”),make_构造函数(&init_from_c_string,default_call_policies(),(arg(“name”),“使用给定名称构造新对象”。)
//其他.def和类似文件
;
谢谢——感谢标记此dup的人员,我同意另一个问题中的解决方案与此答案大致相同,但此问题直接解决了我关于使用自定义自由方法的问题,而另一个问题与此无关(尽管在我的情况下使用该解决方案确实有效)。谢谢——感谢标记此dup的人员,我同意另一个问题中的解决方案与此答案大致相同,但这一个直接解决了我关于使用自定义自由方法的问题,而另一个问题实际上与此无关(尽管在我的案例中使用该解决方案确实有效)。感谢标记此dup的人员,我同意另一个问题中的解决方案与此答案大致相同,但这一个直接解决了我关于使用自定义自由方法的问题,而另一个问题实际上与此无关(尽管在我的案例中使用该解决方案确实有效)。感谢标记此dup的人员,我同意另一个问题中的解决方案与这个答案大致相同,但这一个直接解决了我关于使用自定义自由方法的问题,而另一个问题实际上与此无关(尽管在我的案例中使用该解决方案确实有效)。