为了账号安全,请及时绑定邮箱和手机立即绑定

Cython 对存储在 C 对象中的 cdef 类的弱引用

Cython 对存储在 C 对象中的 cdef 类的弱引用

至尊宝的传说 2021-11-02 18:58:55
我正在尝试为 linphone 库编写 Cython 包装器,但我面临一个问题:我想在 C 对象中存储表示我的 C 对象的 Python 对象的弱引用。这是我的包装器:cdef void on_global_state_changed_cbs(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message):    print('Internal Callback : ' + str(gstate) + ' : ' + message)    cbs = linphone_core_get_current_callbacks(lc)    callbacks = CoreCallbacks.from_ptr(cbs)    if callbacks.global_state_cb is not None:        core = Core.from_ptr(lc)        callbacks.global_state_cb(core, gstate, message)ctypedef struct LinphoneCoreCbs:    passcdef class CoreCallbacks:    cdef object __weakref__    cdef LinphoneCoreCbs *ptr    cpdef global_state_cb    @staticmethod    cdef CoreCallbacks from_ptr(LinphoneCoreCbs *_ptr, take_ref = True):        cdef CoreCallbacks coreCbs        user_data = belle_sip_object_data_get(<belle_sip_object_t *>_ptr, 'python_user_data')        if user_data is not NULL:            tmpWRef = <object>user_data            print tmpWRef            coreCbs = tmpWRef()            if coreCbs is None:                coreCbs = CoreCallbacks.__new__(CoreCallbacks)                coreCbs.ptr = linphone_core_cbs_ref(_ptr) if take_ref else _ptr        else:            coreCbs = CoreCallbacks.__new__(CoreCallbacks)            coreCbs.ptr = linphone_core_cbs_ref(_ptr) if take_ref else _ptr        print coreCbs        wref = weakref.ref(coreCbs)        print wref        belle_sip_object_data_set(<belle_sip_object_t *>_ptr, 'python_user_data', <void *>wref, NULL)        linphone_core_cbs_set_global_state_changed(coreCbs.ptr, &on_global_state_changed_cbs)        return coreCbs    def __dealloc__(self):        print 'Dealloc ' + str(self)        if self.ptr is not NULL:            belle_sip_object_data_remove(<belle_sip_object_t *>self.ptr, 'python_user_data')            linphone_core_cbs_unref(self.ptr)        self.ptr = NULL问题是当我从回调中调用 Core.from_ptr 时,tmpWRef 表示该对象已死,因此创建了一个新对象。我在dealloc方法中添加了一个打印,我看到对象还没有被释放。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

感谢 DavidW 我发现了问题:weakref 没有被任何人持有。我在我的班级中添加了一个 cpdef wref 字段,现在它工作正常:)


查看完整回答
反对 回复 2021-11-02
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信