0
我有一個C++函數Obj *new_object(const char *name)
。它返回一個新的對象,從一個私人池中分配。該對象應該通過免費()或刪除來釋放free_object(Obj *obj)
(和而不是)。我如何安排我的boost.python包裝,以便當python obj超出範圍(並調用gc)free_obj
將被調用?如何讓boost.python調用一個函數來釋放對象?
我有一個C++函數Obj *new_object(const char *name)
。它返回一個新的對象,從一個私人池中分配。該對象應該通過免費()或刪除來釋放free_object(Obj *obj)
(和而不是)。我如何安排我的boost.python包裝,以便當python obj超出範圍(並調用gc)free_obj
將被調用?如何讓boost.python調用一個函數來釋放對象?
我認爲最方便的方法是確保您的Boost.Python類聲明包裝Obj
和boost::shared_ptr<Obj>
。
然後,使用boost::python::make_constructor
在施工時實例化對象。您返回的boost::shared_ptr<Obj>
應該設置它自己的析構函數(在你的情況下,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
;
感謝 - 爲了誰標誌着這個DUP的鄉親,我同意在其他問題的解決方案是關於同這個答案,但是這一次直接解決了我關於使用問題一個自定義的免費方法,其他問題並不是真的(雖然使用該解決方案在我的情況下工作)。 – GaryO