Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';删除对象时不能调用get\uuu dealloc\uuuu 我有以下C++类:_C++_Python_Destructor_Cython - Fatal编程技术网

我能';删除对象时不能调用get\uuu dealloc\uuuu 我有以下C++类:

我能';删除对象时不能调用get\uuu dealloc\uuuu 我有以下C++类:,c++,python,destructor,cython,C++,Python,Destructor,Cython,H .CPP 我用Cython将其曝光如下: cdef extern from "adapter/ALabSiteSetsManager.h" namespace "elps" : cdef cppclass ALabSet: ALabSet(PyObject *) PyObject *GetPyObj() cdef class PyLabSet: cdef ALabSet *thisptr def __cinit__(self)

H

.CPP

我用Cython将其曝光如下:

cdef extern from "adapter/ALabSiteSetsManager.h" namespace "elps" :
    cdef cppclass ALabSet:
        ALabSet(PyObject *)

        PyObject *GetPyObj()



cdef class PyLabSet:
    cdef ALabSet *thisptr

    def __cinit__(self):
       self.thisptr = new ALabSet(<PyObject *>self)

    def __dealloc__(self):
       print "delete from PY !"
       if self.thisptr:
           del self.thisptr
我在网上找不到类似的问题。你们有谁知道我在这里遇到了什么吗

我遗漏了一些关于参考计数管理的信息,或者


非常感谢

dela_set
删除了对对象(局部变量)的引用。C++对象中还有另一个引用。这称为参考循环。循环GC可能会在一段时间后收集这些数据。但是,无法保证何时发生(或者如果发生),因此您不应该依赖它1

例如,包含纯Python对象的引用循环使用一种特殊的方法,根本不会被释放:

在版本3.4中更改:在PEP442之后,具有
\uu del\uu()
方法的对象不再以
gc.garbage
结束

我不知道是否触发了这种行为,但正如前面所述,破坏并不是决定性的。如果您想释放一些资源(例如,不是Python对象的内存块、文件、连接、锁等),您应该公开手动释放的显式方法(参见各种对象的
close
方法)。上下文管理器可以简化这样做的客户机代码

免责声明:几乎所有这些都是针对CPython的


1有些人更喜欢将GC看作是一种模拟无限内存可用性的抽象,而不是破坏不可访问对象的抽象。通过这种方法,很明显,销毁不是确定性的,甚至不能保证。

dela_set删除对对象(局部变量)的引用。C++对象中还有另一个引用。这称为参考循环。循环GC可能会在一段时间后收集这些数据。但是,无法保证何时发生(或者如果发生),因此您不应该依赖它1

例如,包含纯Python对象的引用循环使用一种特殊的方法,根本不会被释放:

在版本3.4中更改:在PEP442之后,具有
\uu del\uu()
方法的对象不再以
gc.garbage
结束

我不知道是否触发了这种行为,但正如前面所述,破坏并不是决定性的。如果您想释放一些资源(例如,不是Python对象的内存块、文件、连接、锁等),您应该公开手动释放的显式方法(参见各种对象的
close
方法)。上下文管理器可以简化这样做的客户机代码

免责声明:几乎所有这些都是针对CPython的


1有些人更喜欢将GC看作是一种模拟无限内存可用性的抽象,而不是破坏不可访问对象的抽象。通过这种方法,很明显销毁是不确定的,甚至没有保证的。

我认为您正在创建一个引用循环,在
self.thisptr=new-ALabSet(self)
中,您正在增加类的引用计数。是的,祝您好运!我删除了额外的Py_XINCREF s,它成功了。好主意。谢谢现在我记不清我在构造函数中做了什么。需要看看“import_cylep()”,它显然是由Cython生成的,但我不知道它还能做什么?我遇到了类似的问题,因为我正在创建循环引用。相关:我想你正在创建一个引用循环,在
self.thisptr=new-ALabSet(self)
中,你正在增加你的类的引用计数。是的,神奇的你!我删除了额外的Py_XINCREF s,它成功了。好主意。谢谢现在我记不清我在构造函数中做了什么。需要看看“import_cylep()”,它显然是由Cython生成的,但我不知道它还能做什么?我遇到了类似的问题,因为我正在创建循环引用。通过使用解决了它,这是很好的描述。相关:好的,感谢提供有用的信息。我知道非确定性行为,但我有一个巨大的内存泄漏,因为我为每个对象创建了两倍于@Wessie建议的引用…@Golgauth实际上,在大多数情况下,对“打破”循环的引用保持沉默是错误的。这意味着引用不会使对象保持活动状态,因此它可能会消失在你的脚下,而不像弱引用(如果你足够关心,这是正确的解决方案)那样,你不会被告知它何时发生,也无法检查引用的有效性。在您的特定情况下,这可能没问题,因为两个对象的生命周期似乎完全相同。不过,要非常小心。保持参考循环(或使用weakref)并提供明确的处置机制更好。是的,你是对的。我现在明白了。当我直接使用python返回的对象时(不将其存储在变量-ex:Count(GetPyLabSet()),其中GetPyLabSet()返回一个PyLabSet对象),它已经被释放了。它发出很好的撞击声。似乎我唯一的选择是保留我以前的Py_XINCREF并创建一个附加函数来显式地调用Py_XDECREF。。。除非你们中的一个有第三种方法来解决我的问题。再次感谢。我在保留对对象的引用时使用了
PyWeakref\u NewRef
,最后调用dealloc:)如下
this->m_obj=PyWeakref\u NewRef(obj,NULL)
我仍然在做
Py\u XINCREF
。还有一件事,因为扩展类必须在类中有
cdef object\uuuuuuuwakref\uwakref
,这样我们才能创建一个weakref。好的,感谢提供有用的信息。我知道非确定性行为,但我有一个巨大的内存泄漏,因为我为每个对象创建了两倍于@Wessie建议的引用…@Golgauth实际上,在大多数情况下是
ALabSet::ALabSet(PyObject *obj): LabSet() {

    this->m_obj = obj;
    // Provided by "cyelp_api.h"
    if (import_cyelp()) {
    } else {
        Py_XINCREF(this->m_obj);
    }

}


ALabSet::~ALabSet() {
    Py_XDECREF(this->m_obj);
}


PyObject *ALabSet::GetPyObj() {
    return this->m_obj;
}
cdef extern from "adapter/ALabSiteSetsManager.h" namespace "elps" :
    cdef cppclass ALabSet:
        ALabSet(PyObject *)

        PyObject *GetPyObj()



cdef class PyLabSet:
    cdef ALabSet *thisptr

    def __cinit__(self):
       self.thisptr = new ALabSet(<PyObject *>self)

    def __dealloc__(self):
       print "delete from PY !"
       if self.thisptr:
           del self.thisptr
a_set = PyLabSet()
del a_set